实现2的1000次方

Posted on 2021-07-01 22:55  foghorn  阅读(485)  评论(0编辑  收藏  举报

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 }

Copyright © 2024 foghorn
Powered by .NET 9.0 on Kubernetes