【解题思路】这道题的难点是超多位数,也就是说40位数用最长的基础类型都表示不下。这个时候可以用数组,最简单的就是你定义三个长度为40的字符数组,每个元素存放一个0-9的数值,然后逐位进行加运算,碰到超过10的就进位。
【程序代码】
#include
#include
#include
using namespace std;
int main()
{char a[40]={0},b[40]={0},c[41],d,i,j,k;
printf("请输入第一个位:"); //显示输入提示
for(i=0;i<40;i++) //通过循环读入a数组
{do{d=getch(); //从键盘获取一个字符
if(d==13||d==' ') break; //如果读到的是回车或空格退出循环
}while(d<'0'||d>'9'); //如果输入的为非数字,忽略重输
printf("%c",d); //显示字符(因为getch函数不回显)
if(d==13||d==' ') break; //如果是回车或空格结束读取
c[i]=d-'0';} //否则的话让c[i]等于输入的数值
i--;
for(k=i;k>=0;k--) a[i-k]=c[k]; //倒序排列
/*关于输入有很多种方法,可以用cin, scanf(),也可以用getchar(),各有优劣,这里之所以用getch(),是因为getch不回显,这样可以及时作出判断,不是数字就直接忽略。
另外为什么要倒序,是为了保证a[0]和b[0]都是个位数,这样后面加法运算时,不用去费劲的对齐*/
printf("\n请输入第二个位:"); //显示输入提示
for(j=0;j<40;j++) //通过循环读入b数组
{do{d=getch(); //从键盘获取一个字符
if(d==13||d==' ') break; //如果读到回车或空格退出循环
}while(d<'0'||d>'9'); //如果输入的为非数字,忽略重输
printf("%c",d); //显示字符(因为getch函数不回显)
if(d==13||d==' ') break; //如果是回车或空格结束读取
c[j]=d-'0';} //否则的话让c[j]等于输入的数值
j--;
for(k=j;k>=0;k--) b[j-k]=c[k]; //倒序排列
for(k=0;k<41;k++) c[k]=0; //初始化c数组
if (iprintf("\n两个数的和等于:"); //显示结果
for(k=0;k<=d;k++) //通过循环计算
{c[k]=(c[k]+a[k]+b[k]); //算出和
c[k+1]=c[k]/10; //如果超过10则进位
c[k]=c[k]%10;} //取个位数,避免超过10
if(c[d+1]!=0) d++; //如果最高位有进位,则最高位再加一位
for(k=d;k>=0;k--) //用循环显示出c数组的每一位
printf("%d",c[k]); //显示出c数组的每一位
printf("\n",d); //换行
system("PAUSE"); //暂停屏幕,以看清结果
return 0;} //结束程序
【运行结果】
这个涉及到格式化输入,其余都不难。只要知道如何格式话输入即可。
代码如下:
#pragma warning(disable : 4996)
#include
int main()
{
int a, b;
scanf("%40d", &a);
scanf("%40d", &b);
printf("%d", a+b);
return 0;
}