目錄
1268:【基礎】高精度加法
1269:【基礎】高精度減法
1280:【基礎】求 2 的 n 次方
1281:【基礎】求 2+2×2+2×2×2+?+2×2×2×?×2
1285:【基礎】計算 N 的階乘
1286:【基礎】高精度乘單精度
1287:【基礎】高精度乘
?1288:【入門】正整數 n 轉換為 8 進制
1289:【入門】正整數 N 轉換為 16 進制
解法一:分別判斷 ?n%16 結果在 0~9 及 10~15 的哪個范圍,分別轉換為對應的字符
解法二:用字符串存儲十六進制對應的字符,簡化 16 進制轉為字符的過程
1290:【入門】二進制數轉換十進制
1291:【入門】八進制轉十進制
1292:【入門】十六進制轉十進制
1294:【基礎】二進制轉十六進制
1268:【基礎】高精度加法
#include <bits/stdc++.h>
using namespace std;
/*
第一步:用 string 讀入高精度整數
第二步:將兩個高精度整數逆序存入 a、b 兩個整數數組
第三步:從左向右,逐位求和,結果存入 c 數組從左向右,逐位進位
第四步:逆序輸出結果
*/
string s1, s2;//高精度整數
int a[250], b[250], c[500];
int i, j, len;int main(){cin >> s1 >> s2;//第二步:將兩個高精度整數逆序存入 a b 兩個整數數組for (i = 0; i < s1.size(); i++){a[s1.size()-i-1] = s1[i]-'0';}for (i = 0; i < s2.size(); i++){b[s2.size()-i-1] = s2[i]-'0';}//第三步:從左向右,逐位求和,結果存入 c 數組// 從左向右,逐位進位//加法的次數,取決于兩個整數的較長的字符串len = s1.size();if (s2.size() > s1.size()){len = s2.size();}//逐位相加for (i = 0; i < len; i++){c[i] = a[i] + b[i];}//逐位進位for (i = 0; i < len; i++){if (c[i] >= 10){c[i+1] = c[i+1] + c[i] / 10;c[i] = c[i] % 10;}}//第四步:逆序輸出結果//兩個不超過 len 位的整數做加法,結果可能是 1en+1 位if (c[len] != 0){len++;}//逆序輸出結果for (i = len - 1; i >= 0; i--){cout << c[i];}}
1269:【基礎】高精度減法
#include <bits/stdc++.h>
using namespace std;
/*
第一步:判斷 s1 和 s2 的大小關系
第二步:將兩個字符串逆序存入 2 個整數數組
第三步:從左至右,逐位相減,不夠借位
第四步:從右向左,逆序輸出
*/
string s1, s2;
int a[250], b[250], c[250];
int i, len, p;
char f = '+';//表示結果的正負int main(){cin >> s1 >> s2;//字符串長的數值更大,一樣長字典碼大的一定大;if (s1.size() < s2.size() || (s1.size() == s2.size() && s1 < s2)){f = '-';swap(s1, s2);//直接交換兩個變量的值}//將s1和s2逆序存入整數數組for (i = 0; i < s1.size(); i++){a[i] = s1[s1.size()-i-1] - '0';}for (i = 0; i < s2.size(); i++){b[i] = s2[s2.size()-i-1] - '0';}//逐位相減len = s1.size();for (i = 0; i < len; i++){//如果不夠減,向右借 1,當 10 用if (a[i] < b[i]){a[i+1] = a[i+1] - 1;a[i] = a[i] + 10;}c[i] = a[i] - b[i];}//判斷是否要輸出負號if (f == '-') cout << f;//從右向左逐位輸出,從第一個遇到的非 0 元素開始輸出for (i = len - 1; i >= 0; i--){if (c[i] != 0){p = i;break;}}//逆序從第一個非 0 元素輸出每一位for (i = p; i >= 0; i--){cout << c[i];}
}
1280:【基礎】求 2 的 n 次方
#include <bits/stdc++.h>
using namespace std;int a[100] = {1};
//k 代表 a 數組元素的個數,代表了高精度的整數的位數
int i, j, k = 1, n;
int main(){cin >> n;//循環 n 次,每次都將 a 數組 * 2for (i = 1; i <= n; i++){//將 a 數組的每一位都 * 2for (j = 0; j < k; j++){a[j] = a[j] * 2;}//逐位進位for (j = 0; j < k; j++){if (a[j] >= 10){a[j+1] = a[j+1] + a[j] / 10;a[j] = a[j] % 10;}}//判斷 a 數組是否多出一位if( a[k] != 0){k++;}}//逆序輸出 a 數組的 k 個數for(i = k - 1; i >= 0; i--){cout << a[i];}
}
1281:【基礎】求 2+2×2+2×2×2+?+2×2×2×?×2
#include <bits/stdc++.h>
using namespace std;int a[100] = {1};
int r[1000];
//k 代表 a 數組元素的個數,代表了高精度的整數的位數
//k2 代表了高精度的總和的位數
int i, j, k = 1, n, k2 = 1, len;
int main(){cin >> n;//循環 n 次,每次都將 a 數組 * 2for (i = 1; i <= n; i++){//將 a 數組的每一位都 * 2for (j = 0; j < k; j++){a[j] = a[j] * 2;}//逐位進位for (j = 0; j < k; j++){if (a[j] >= 10){a[j+1] = a[j+1] + a[j] / 10;a[j] = a[j] % 10;}}//判斷 a 數組是否多出一位if ( a[k] != 0){k++;}//求出了 2 的 i 次方,結果為 k 位//將 k 位的 2 的 i 次方,加到 k2 位的總和 r 上 len = k;if (k2 > k) len = k2;for (j = 0; j < len; j++){r[j] = r[j] + a[j];//進位if (r[j] >= 10){r[j+1] = r[j+1] + r[j] /10;r[j] = r[j] % 10;}//判斷 r 數組是否多了 1 位if (r[k2] != 0) k2++;}}//輸出 r 數組的結果 for (i = k2 - 1; i >= 0; i--){cout << r[i];}
}
1285:【基礎】計算 N 的階乘
1286:【基礎】高精度乘單精度
#include <bits/stdc++.h>
using namespace std;
/*
第一步:將高精度整數 s1,逆序存入整數數組 a
第二步:將 a 數組的每一位,逐位和整數 b 相乘,結果存入 a 數組
第三步:逐位進位
第四步:逆序輸出
*/string s1;//高精度整數
int a[250], c[250], p;
int b, len;int main(){cin >> s1 >> b;//第二步:將 s1 逆序存入 a 數組 for (int i = 0; i < s1.size(); i++){a[s1.size()-i-1] = s1[i]-'0';}//第三步:逐位相乘 //乘法的次數,取決于符串長度 len = s1.size(); for (int i = 0; i < len; i++){c[i] = a[i] * b;}//逐位進位 //結果的最大可能長度為高精度數值位數+單精度數值位數-1//該題中單精度數值最大是 10000,即 s1*b 最多多出 4 位 for (int i = 0; i < len + 4; i++){if (c[i] >= 10){c[i+1] = c[i+1] + c[i] / 10;c[i] = c[i] % 10;}}//第四步:逆序輸出,從第一個非 0 元素開始輸出 for (int i = len + 3; i >= 0; i--){if (c[i] != 0){p = i;break;}}for (int i = p; i >= 0; i--){ cout << c[i];}}
1287:【基礎】高精度乘
#include <bits/stdc++.h>
using namespace std;string s1, s2;
int a[250], b[250], c[500];
int p;int main(){cin >> s1 >> s2;//將 s1 和 s2逆序輸入數組for (int i = 0; i < s1.size(); i++) {a[i] = s1[s1.size()-i-1]-'0';}for (int i = 0; i < s2.size(); i++) {b[i] = s2[s2.size()-i-1]-'0';}//逐位乘(進位) for (int i = 0; i < s1.size(); i++){for (int j = 0; j < s2.size(); j++){c[i+j] = c[i+j] + a[i] * b[j];//進位if (c[i+j] >= 10){c[i+j+1] = c[i+j+1] + c[i+j] / 10;c[i+j] = c[i+j] % 10;} }} //逆序輸出,從第一個非 0 元素輸出for (int i = s1.size() + s2.size() - 1; i >= 0; i--){if (c[i] != 0){p = i;break;}} for (int i = p; i >= 0; i--){cout << c[i];}
}
?1288:【入門】正整數 n 轉換為 8 進制
#include <bits/stdc++.h>
using namespace std;int main(){long long n;string s;char c;cin >> n;//除 8 取余 while (n != 0){c = n % 8 + '0';n = n / 8;s = c + s;}if (s == ""){cout << 0;}else{cout << s;}}
1289:【入門】正整數 N 轉換為 16 進制
解法一:分別判斷 ?n%16 結果在 0~9 及 10~15 的哪個范圍,分別轉換為對應的字符
#include <bits/stdc++.h>
using namespace std;
/*
n是一個不超過 18 位的正整數
*/
long long n, x;
string s;
char c;
int main(){cin >> n;while (n != 0){x = n % 16;//cout<<x<<endl;//將 x 轉換為字符逆序存入字符串 s//x:0~9 ->'0'~'9'//x:10~15 ->'A'~'F'if (x < 10){c = x + '0';}else{c = x + 'A' - 10;}s = c + s;n = n / 16;}if (s == ""){cout << 0;}else{cout << s;}}
解法二:用字符串存儲十六進制對應的字符,簡化 16 進制轉為字符的過程
#include <bits/stdc++.h>
using namespace std;
/*
n是一個不超過 18 位的正整數
*/
long long n, x;
string s;
string t = "0123456789ABCDEF";
int main(){cin >> n;while (n != 0){x = n % 16;//cout << x << endl;//將 x 轉換為字符逆序存入字符串 s//x:0~9 ->'0'~'9'//x:10~15 ->'A'~"F//將 n%16 轉換為字符逆序存入 ss = t[x] + s;n = n / 16;}if (s == ""){cout << 0;}else{cout << s;}
}
1290:【入門】二進制數轉換十進制
#include <bits/stdc++.h>
using namespace std;string s;//存放二進制
int r, t = 1, i;//t:表示權重
int main(){cin >> s;for (i = s.size() - 1; i >= 0; i--){r = r + (s[i] - '0') * t;t = t * 2;}cout << r;
}
1291:【入門】八進制轉十進制
#include <bits/stdc++.h>
using namespace std;int main(){string x;long long r = 0;long long t = 1;cin >> x;for (int i = x.size() - 1; i >= 0; i--){r = r + (x[i]-'0') * t;t = t * 8;}cout << r;
}
1292:【入門】十六進制轉十進制
#include <bits/stdc++.h>
using namespace std;
string s;
long long r, t = 1, i;//t:表示權重,也就是 16 的 i 次方
int main(){cin >> s;//逆序計算,按權展開for (i = s.size() - 1; i >= 0; i--){//如果 s[i] 是 '0'~'9'if (isdigit(s[i])){r = r + (s[i] - '0') * t;}else{//如果 s[i] 是'A'~'F'r = r + (s[i] - 'A' + 10) * t;}t = t * 16;}cout << r;
}
1294:【基礎】二進制轉十六進制
# include <bits/stdc++.h>
using namespace std;
//將 4 位的 2 進制 轉換為 1 位的 16 進制
char num(string s){//從最低位開始按權展開,將 2 進制轉換為十進制//再轉換為 16 進制int r = 0, t = 1;for (int i = s.size()-1; i >= 0; i--){r = r + (s[i] - '0') * t;t = t * 2;} char c;//存儲 1 位的 16 進制字符if (r < 10) {c = r + '0';}else{c = r + 'A' - 10;}return c;
} int main(){string s, t;//存放二進制cin>>s;//補 0 if (s.size() % 4 == 1){s = "000" + s;}else if (s.size() % 4 == 2){s = "00" + s;}else if (s.size() % 4 == 3){s = "0" + s;} // 每 4 位一格,將 4 位的二進制轉換為 16 進制for (int i = 0; i < s.size(); i = i + 4){t = s.substr(i, 4);cout << num(t); }
}