高精度求幂
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 }