拿到题目一瞅,2的一千次,爆破又要突破极限了,那么尝试把次方拆开算,似乎有点难
看看大佬的想法:用数组模拟乘法(字符串也可)
unsigned long long 也就20位数左右,这个数组长度给到多少合适呢?
首先判断一个数有多少位就是看它能除几个10,也就是10的几次会等于这个数,2^1000对10取对数
=1000lg2 ,lg2大约为0.30103,那么2^1000次方就大概有301位左右,大佬豪横的直接给它505位
#include<iostream>
using namespace std;
const int max_num=505;
int main() {
int location=0;
int a[max_num]={0};
a[0]=1;//个位赋1,从个位开始乘2
int x=0,sum=0;//x存放进位
for(int i =1;i<=1000;i++)
{
for(int j =0;j<max_num;j++)
{
if(a[j]<5&&a[j]>=0)
{
a[j]=a[j]*2+x;
x=0;
}
else{
a[j]=2*a[j]-10; //在进位的情况下,先加上本位数,在加上低位的进位x,然后再把本位的进位赋值给x;
a[j]=a[j]+x;
x=1;
}
}
}
//寻找第一个不为0的数即为要求数字的第一位
for(int i=max_num-1;i>=0;i--)
{
if(a[i]!=0)
{
location=i;
break;
}
}
for(int i=location;i>=0;i--)
{
sum+=a[i];
}
cout<<sum<<endl;
return 0;
}
大佬的代码有点小错误,在寻找数组最高位时i要等于max_num-1,如果取到max_num的话就会出现越界,正确答案为1366