解题思路:

先找规律,然后利用高精度算法

注意事项:


参考代码:

#include<stdio.h>

//根据规律,该问题的解是res=2*(2^n-1)=2^(n+1)-2 

int twopown(int n);//高精度计算2^n 

int res[200]={0};

int main()

{

int n,num,i;

int a[200]={0};//由于最后要减2,这里不得不计算一下高精度减法,所以定义了一个数组a[200],它只有a[0]=2,其他位都是0,用它当高精度减数 

a[0]=2;

scanf("%d",&n);

num=twopown(n+1);//计算 2^(n+1),并得到这个大整数的总位数 

for(i=0;i<num;i++)//高精度减法,首先每一位对应简单相减 

{

res[i]=res[i]-a[i];

}

for(i=0;i<num;i++)//然后考虑退位 

{

if(res[i]<0)//如果这一位小于0 

{

res[i+1]=res[i+1]-1;//先向高位借位 

res[i]=res[i]+10;//借位后此位加10 

}

}

for(i=num-1;i>=0;i--)

{

printf("%d",res[i]);//倒叙输出(因为res[0]对应最低位) 

}

return 0;

}

int twopown(int n)//高精度计算2^n 

{

int i,j,num=1;//num用来计算最后结果大整数的位数 

res[0]=1;//初始化,因为要计算乘法,res[0]首先要置1 

for(i=0;i<n;i++)//i控制乘n次 

{

for(j=0;j<num;j++)//j控制此时有意义的位数的乘法 ,对有意义的位,都先简单乘2 

{

res[j]=res[j]*2;

}

for(j=0;j<num;j++)//处理大于10的位 

{

if(res[j]>=10)//如果某位大于10 

{

res[j+1]=res[j+1]+res[j]/10;//向高位进位 

res[j]=res[j]%10;//此位只留除10的余数 

}

}

if(res[j]>0)//如果这次乘二得到了新的有意义的位,则num加一 

num++;

}

return num;

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论