大数加法
long long都存不进去啊。
所以说,模拟小学生加法。
用数组存储输入的数字,然后从后往前,记得进位就行了
要考虑的问题:
1)
如果两个数长度不一样,像这样:
按位加的话,会成这个样子
你肯定不想吧
这样就有一个翻转数组的方法了
从中间分开,对称交换。
像这样:
for(int i = 0; i < len / 2; ++i){
t = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = t;
}
注意这里的len-i-1。这是因为数组是从0开始标号的,它最大的标号是len-1
2)
还是上边的例子,为什么自动加0了呢。
如果不加的话。
计算机并不能自动添加0
所以需要做一个判断
像这样:
ai = i < len1 ? a[i] - '0' : 0;
(c中的ascll码是可以相减的)
如果这里有数的话,那就减0,否则添加0
然后呢,模拟就完事了。
方法一:
#include <stdio.h>
#include <string.h>
void rev(char str[], int len)
{
char t;
for(int i = 0; i < len / 2; ++i){
t = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = t;
}
}
int main()
{
char a[1000],b[1000],c[1000];
int ai, bi, val, carry;
int len, len1, len2;
scanf("%s %s", a, b);
len1 = strlen(a);
len2 = strlen(b);
len = len1 > len2 ? len1 : len2;
rev(a,len1);
rev(b,len2);
carry = 0;
for(int i = 0; i < len; ++i){
ai = i < len1 ? a[i] - '0' : 0;
bi = i < len2 ? b[i] - '0' : 0;
val = (ai + bi + carry) % 10;
carry = (ai + bi + carry) /10;
c[i] = val + '0';
}
if(carry == 1) putchar('1');
for(int i = len - 1; i >=0 ; --i)
putchar(c[i]);
puts("");
return 0;
}
和方法一大同小异。也贴上吧。
方法二:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int main()
{
char a[1000],b[1000];//创建一个数组。
int result[1000];//给结果也创建一个
int lena,lenb,len_result,lenc;//a,b,result的长度也要创建鸭.引入这么一个变量lenc(a+b=c嘛)。
int i,j,k;//for用的
while(scanf("%s%s",a,b)!=EOF)//多组输入
{
lena=strlen(a);
lenb=strlen(b);
for(j=0;j<lena;j++)
a[j]-='0';
for(j=0;j<lenb;j++)
b[j]-='0';//这里只是扩一下容(补0)
if(lena>lenb) len_result=lena;
else len_result=lenb;
lenc=len_result-1;//模拟竖式加法嘛,
for(j=lena-1,k=lenb-1;;j--,k--)//既然要循环,就一起啦
{
if(j>=0&&k>=0) result[lenc--]=a[j]+b[k];
else if(j>=0) result[lenc--]=a[j];
else if(k>=0) result[lenc--]=b[k];
else break;
}
for(j=len_result-1;j>0;j--)//这里是换位加一呢
{
if(result[j]>=10)
result[j-1]+=result[j]/10;
result[j]=result[j]%10;
}
for(j=0;j<len_result;j++)
printf("%d",result[j]);
printf("\n");//因为我写的多组输入呢,所以要换行哦
}
return 0;
}