解题思路:用数组来代表所求数的每一位(本题所求数远远大于long long的规定范围),如a[0]代表个位,a[1]代表十位,a[2]代表百位,以此类推;一个数的乘算可以拆分为他每一位数的成算,这是需要理解的点
注意事项:我的解法中一开始忽略了第一次的值1,后来发现懒得改了,也可以把(总值=总值+单个数)放在单个数*2前面,然后循环64次
参考代码:
#include<stdio.h>
int main()
{
int i,s,j;
int a[30],b[30];//a记录单个值,b记录总值
for(i=0;i<30;i++)//赋值初值都为0
{
a[i]=0;b[i]=0;
}
a[0]=1;
for(i=1;i<64;i++)//以下过程循环63次
{
for(j=0;j<25;j++)
{
a[j]=a[j]*2;//单个值的每一位都乘以2
}
for(j=0;j<25;j++)//单个值进位
{
if(a[j]>=10)//此处可用if,因为个位数*2不会超出20,若是*3之类的需要用while,这点需要注意
{
a[j]=a[j]-10;
a[j+1]++;
}
}
for(j=0;j<30;j++)//当前总值每一位加上单个值
{
b[j]=b[j]+a[j];
}
}
for(j=0;j<30;j++)//总值进位 (只需做一次,不用放循环内部,徒增运行时间)
{
while(b[j]>=10)
{
b[j]=b[j]-10;
b[j+1]++;
}
}
for(i=29;i>=0;i--)//输出答案
{
if(b[i]!=0)
{
for(j=i;j>=1;j--)
{
printf("%d",b[j]);
}
printf("%d",b[0]+1);//输出的个位数应加上循环中未考虑的第一次值为1
return 0;
}
}
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复