高精度求幂

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 const int N = 3010; //定义一个3010位的数组,表示高精度运算的支持位数,最大可以很大
 6 
 7 int main()
 8 {
 9     int a[N] = {1};  
10         /* 
11         重点!!!在高精度运算的加,减,乘中,存储数字的时候是翻转的,0位存的是最高位,第3009位存的是个位
12         int a[N] = {1};的目的是把这个数初始化成1,也就是说在数组内是{1,0,0,...,0},其实这个数组就代表数字0000000.....001,也就是1
13         这个程序要做的是求指数,所以这一步把数初始化成一是对任意一个指数x的初始化,x的0次方,x ^ 0 == 1
14         */
15     int n;
16     cin >> n; // n次方
17     int m = 1; 
18     /* 
19     位数,m在这里的作用就是记位,比如2的n次方,2,4,8的时候m都是1,到后面数字变成16,也就是{6, 1, 0, ...., 0}的时候,m就变成2,使j对每一位数都会做运算
20     */
21     
22     for (int i = 0; i < n; i ++ ) { // 2的n次方就是1乘以n次2,x的n次方就是x ^ 0乘以n次x
23         int t = 0;
24         for (int j = 0; j < m; j ++ ) {
25             t += a[j] * 2; // 这个程序算的是2的n次方,对2改变可以算x的n次方
26             a[j] = t % 10;
27             t /= 10; // 整个循环一直在对a数组自身做改变,所以不需要定义第二个数组
28         }
29         if (t) a[m ++ ] = t; 
30             /* 
31             进位,例如2 * 0, t /= 10以后就变成0了,if语句就不执行,当t /= 10后不是0,例如2 * 9, t首先是18,然后8给a[j], t变成1,下一位本来是0,就变成t(如果不是2的n次方,是2以上的数的n次方,
32             会出现例如3 * 8的情况,那么t首先是24,4给a[j], t变成2,下一位本来是0,变成2
33             */
34     }
35     
36     for (int i = m - 1; i >= 0; i -- ) cout << a[i]; // 因为存的时候是翻转过来存的,所以输出的时候再翻转输出,就变成正常顺序了
37     cout << endl;
38     return 0;
39 }

 

posted @ 2021-03-02 10:44  MerielVaren  阅读(134)  评论(0)    收藏  举报