0 注意事项
2的1000次方是一个十分庞大的数,因此不可直接用常规方法直接迭代乘1000次2或者用pow等求幂运算的函数。
1 思路
本文提供两种思路处理此题:
- 字符串
将运算过程中的所有结果都看成是字符串,每次对前一次的结果(字符串)扩大2倍,循环1000次即可。
- 数组
首先开辟一块足够大的内存空间存放所有的数位,每次对每个数位乘2,循环1000次。
2 代码
- 字符串实现
1 #include <iostream> 2 #include <stack> 3 #include <cstring> 4 5 using namespace std; 6 7 string TwoTimes(string s) { 8 int n = (int)s.size() - 1; 9 int jinwei = 0; 10 stack<int> stk; 11 12 while (n >= 0) { 13 stk.push(((s[n] - '0') * 2 + jinwei) % 10); 14 jinwei = ((s[n] - '0') * 2 + jinwei) / 10; 15 --n; 16 } 17 18 if (jinwei) { 19 stk.push(jinwei); 20 } 21 22 string ans = ""; 23 while (!stk.empty()) { 24 ans += to_string(stk.top()); 25 stk.pop(); 26 } 27 28 return ans; 29 } 30 31 32 int main() 33 { 34 int n = 1000; 35 string s = "1"; 36 for (int i = 1; i <= n; ++i) { 37 s = TwoTimes(s); 38 } 39 cout << s << endl; 40 41 return 0; 42 }
- 数组实现
1 void TwoTimesByArray(int n) { 2 int digit_nums[n]; 3 memset(digit_nums, 0, sizeof(int) * n); 4 digit_nums[0] = 1; 5 int cur_max = 0; 6 int jinwei = 0; 7 int temp; 8 9 for (int i = 1; i <= n; ++i) { 10 for (int j = 0; j <= cur_max; ++j) { 11 temp = digit_nums[j]; 12 digit_nums[j] = (temp * 2 + jinwei) % 10; 13 jinwei = (temp * 2 + jinwei) / 10; 14 } 15 if (jinwei) { 16 ++cur_max; 17 digit_nums[cur_max] = jinwei; 18 } 19 jinwei = 0; 20 } 21 22 while (cur_max >= 0) { 23 cout << digit_nums[cur_max]; 24 --cur_max; 25 } 26 cout << endl; 27 }