大数相加
1;大数,什么是大数,就是不能再用什么(int ,long long int, double)等等数据类型来保存了的数字;这简单,不能用这些我们很快的可以想到用数组存起来不就可以了吗;
2;存大数的确很简单,那大数的四则运算了;大数的加法呢;我们可以很快的也有了想法;那不就是把数组的对应位相加如果大于10就进一不就OK了;的确思维确实是这样的,但是知道想法是简单的打起代码来就不简单了哦;不信可以试试;
3;打代码是会出现的问题;
(1怎么输入,已什么形式输入;等下怎么处理;
(2长的,短的怎么去加啊;
(3高位与低位搞晕了;
(4进位可能会出错;
这些都是我第一次打的时候遇到的问题;在这里一一搞清楚;
我有几种代码先说第一种是这么解决这些问题的;
1;输入当然用字符串输入啊
while(scanf("%s",a) != EOF){
scanf("%s",b);
}
2;长短;这个容易,直接在前面来个比较;进行赋值
lena = strlen(a);
lenb = strlen(b);
if(lena < lenb){//换边。将长的放在前面;
strcpy(t, b);
strcpy(b, a);
strcpy(a,t);
m = lenb;
lenb = lena;
lena = m;
}
3;现在我们已经把长的数组放在了前面a,短的放在了后面,先在就可以模拟了;
(1;因为我们是%s输入的因此高位就是数组下标小的,也就是a[0]是这个数的最高位,同理b也是这样的,高位在数组的前面,因此我们在计算的时候要要从最后面开始。当然下标肯定不是lena和lenb啊;似不似啊,这点有时候打快了就变成了从lena,lenb开始了,不是从那里开始啊,是从lena-1,lenb-1开始啊!这点是个细节。
(2;还有就是计算应该分成两个部分去做,一部分是计算两个数组 重合的部分,另外一部分就是还有一个长点的数组剩余的部分。
(3;怎么进位呢?这里是个小技巧,看下面代码细想一下就知道了;
jzs = 0;
l = 0;
for(i = lena-1, j = lenb-1; j != -1; i--, j--){//计算公共部分。也就是数组短的那部分
wsh = (a[i]-'0')+(b[j]-'0')+jzs;
//printf("%d\n",wsh);
if(wsh > 9){
jzs = 1;
wsh = wsh%10;
}
else jzs = 0;
k[l] = wsh;
l++;
}
for(; i != -1; i--){//数组长的剩余的部分
wsh = (a[i] - '0')+jzs;
if(wsh > 9){
jzs = 1;
wsh = wsh%10;
}
else jzs = 0;
k[l] = wsh;
l++;
}
进位技巧在于这里;
**wsh = (a[i]-‘0’)+(b[j]-‘0’)+jzs;
还有就是在循环外面记得初始化;里面进位要考虑其wsh是否大于9**
wsh = (a[i] - '0')+jzs;
if(wsh > 9){
jzs = 1;
wsh = wsh%10;
}
else jzs = 0;
k[l] = wsh;
l++;
这里要注意的是if那里配对的else,要记得将jzs初始化0一下,在不进位的情况下。
(4;还有一点就是在输出的时候要记得考虑一下进位数jzs是否为0 如果为0就要单独提前输出一下,
if(jzs == 1){//考虑最后一位是否进位了
k[l] = 1;
l++;
}
细节都说完了,摆出代码了;
#include<stdio.h>
#include<string.h>
int main()
{
int lena, lenb, m, i, j, l, jzs, c, wsh, k[1000];
char a[1000], b[1000], t[1000];
while(scanf("%s",a) != EOF){
scanf("%s",b);
lena = strlen(a);
lenb = strlen(b);
if(lena < lenb){//换边。将长的放在前面;
strcpy(t, b);
strcpy(b, a);
strcpy(a,t);
m = lenb;
lenb = lena;
lena = m;
}
jzs = 0;
l = 0;
for(i = lena-1, j = lenb-1; j != -1; i--, j--){//计算公共部分。也就是数组短的那部分
wsh = (a[i]-'0')+(b[j]-'0')+jzs;
//printf("%d\n",wsh);
if(wsh > 9){
jzs = 1;
wsh = wsh%10;
}
else jzs = 0;
k[l] = wsh;
l++;
}
for(; i != -1; i--){//数组长的剩余的部分
wsh = (a[i] - '0')+jzs;
if(wsh > 9){
jzs = 1;
wsh = wsh%10;
}
else jzs = 0;
k[l] = wsh;
l++;
}
if(jzs == 1){//考虑最后一位是否进位了
k[l] = 1;
l++;
}
for(c = l-1; c != -1; c--){
printf("%d",k[c]);
}
printf("\n");
}
return 0 ;
}