问题:
求2^200-2
结果已经超过了int和long long的范围了,所以需要用数组来存储数据了
数组用下标来标识位数,下标为1,标识个位数,2,标识十位数,3标识百位数....,最后,倒序输出,就是结果
用len标识最高位,newl标识下一位
当前这位如果>=5,需要进一位,所以len+1,否则的话,len不变
循环从当前最高位到个位数,每位*2,看每位*2之后的数是否>=10,如果>=10,那么这位的下一位就是+1,这位就是他-10,依次往前循环
-2的时候,因为最低位》=2,所以不需要退位
代码:
#include <iostream>
using namespace std;
//定义一个数组来存储数据,因为数据比较大,用long long 都不行,所以需要定义数组类存储
int a[200];
int main(){
//单个汉诺塔,移动的个数是2^n-1
//推测,2个的话,移动的此时是(2^n-1)*2=2^(n+1)-2
int n;
cin>>n;
int len=1;//标识位数,1标识个位,2标识十位,3标识百位,依次标识
a[1]=2;//初始是2
int newl;
for(int i=1;i<=n;i++){//存储2^(n+1)
if(a[len]>=5){
newl=len+1;
}else{
newl=len;
}
for(int j=len;j>=1;j--){
a[j]=a[j]*2;
if(a[j]>=10){
a[j+1]=a[j+1]+1;
a[j]=a[j]-10;
}
}
len=newl;
}
//个位-2
a[1]=a[1]-2;
for(int i=len;i>=1;i--){
cout<<a[i];
}
return 0;
}
结果:
求1977!
代码:
#include <iostream>
using namespace std;
int main(){
int p[6000]={0};
p[0]=1;
int n=1977,c,sum=0;
for(int i=2;i<=n;i++){
c=0;
for(int j=0;j<6000;j++){
sum=p[j]*i+c;
p[j]=sum%10;
c=sum/10;
}
}
bool b=true;
for(int j=5999;j>=0;j--){
if(p[j]==0&&b){
continue;
}else{
b=false;
cout<<p[j];
}
}
return 0;
}