解题思路:用数组来代表所求数的每一位(本题所求数远远大于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语言代码)浏览:583 |
母牛的故事 (C语言代码)浏览:479 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:1001 |
DNA (C语言描述,数据结构)浏览:909 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:895 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:350 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:541 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:525 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:536 |
C语言训练-字符串正反连接 (C语言代码)浏览:653 |