今天重学了数组的一个方面的重要应用——进行高进度运算。
例题:求2的n次方。
理由:
1.如果不使用数组,纯用变量类型的话,sqrt(3) * sqrt(3) != 3;
2.pow(2,n)进行到n=50时就不准了
代码:
#include <cstdio>
#include <iostream>
const int N = 100010; //给一个较大值,我们可以通过log估算出2的50次方大概有50*3位
using namespace std;
int main()
{
int n;
cin >> n;
int a[N]={1};//a[0]=1,a[1]=0,a[2]=0……
int m = 1; //☆☆☆因为上一行中默认a[0]=1;所以目前总共有1位有效数(m代表位数)
//
for(int i = 1; i <= n; i++){ //n =0压根进不了循环,直接走输出
int t = 0;
for(int j = 0; j < m; j++){
t += a[j] * 2;
a[j] = t % 10;
t = t /10;
}
if(t) a[m++] = 1; //若此时t非0,则表示需要进位;m自增,在下次从外循环进入内循环时会增加内层循环次数。
//2的n次方是可行的,假设有5位数99999,它*2是199998,新增的最高位也是1
//由此想到
//例:2^3=8, 2^4=16;
//输入n =4;
//第一次执行外循环,i=1,t=0;
//第一次进入内循环,i=1,j=0,
// t= t+a[0]*2 = 0+1*2 = 2;
// a[0]= 2%10 =2
// t= 2/10 = 0 出内循环
//第二次执行外循环,i=2,t=0;
//第二次进入内循环,i=2,j=0,
// t= t +a[0]*2 = 4 因为此时a[0]=2;
// a[0] = 4%10 =4
// t= 4/10 = 0 出内循环
//第三次执行外循环,i=3,t=0;
//第三次进入内循环,i=3,j=0,
// t= t +a[0]*2 = 8;
// a[0]= 8%10 = 8;
// t = 8/10 出内循环
//第四次执行外循环,i=4,t=0;
//第四次进入内循环,i=4,t=0,
// t= t +a[0]*2 =16;
// a[0]= 16%10 =6;
// t= 16/10 =1
//重要: a[1]=1;//开启了新的位数,出内循环
}
for(int i = m-1; i >= 0; i--) cout << a[i];//若打印n=4,则a[0]=6,a[1]=1;
//从后向前输出1,6
return 0;
}
终于搞懂了
由此可见要求3的n次方并不是直接在内循环里把2改成3,要讨论m的不同取值