![]() |
#2
laigaoat20052011-04-29 22:28
#include <stdio.h>
#include<iostream> using namespace std; #define ASCII 48 //0-9的ascii码为48 49 50 51 52 53 54 55 56 57 int main() { int i,j,k,m=0,p; char a[1001],b[1001]; int c[1001]; //初始化a,b,c 三数组 for(p=0;p<1001;p++) { c[p]=0; a[p]=' '; b[p]=' '; } while(cin>>a>>b) //输入a b 字符数据 { i=0; j=0; k=0; while(a[i]!=' ') { i++; //输入的第一个数的位数 好像包括两个非数字字符,但我不清楚是哪两个,因此后面要减2 } i=i-2; while(b[j]!=' ') { j++; //输入的第二个数的位数 } j=j-2; while(i>=0&&j>=0) //计算相同位 a 有5位数,b有7位数,就计算各自最后5位数,相反也一样 { if(c[k]+a[i]-ASCII+b[j]-ASCII>9) //计算三个数据的最后一位相加的结果,如果大于9就执行下面的语句块,完成进位 //为什么-ASCOO?因为字符"0"的 ASCOO值为48,字符"1"的ASCOO值为49,所以 0字符加1字符 //就是48+49=97,减去两个48就等于1,也就是数字0+1的结果 { c[k]=(c[k]+a[i]+b[j]-2*ASCII)%10; //计算三个数据的最后一位相加的结果,并除10,得到除开进位后剩下的值并赋值给结果数组c的当前位 c[k+1]++; // 进位 } else c[k]+=a[i]+b[j]-2*ASCII; //不用进位 k++; //结棍数据c后移一个位置 i--; //处理第一个加数的上一位 j--; //处理第二个加数的上一位 反复到计算完成所有位 } while(i>=0) //如果a的数位比b的位数多,这里就会大于0,就会像上面那个函数一样进行计算 { if(c[k]+a[i]-ASCII>9) { c[k]=(c[k]+a[i]+b[j]-2*ASCII)%10; c[k+1]++; } else c[k]+=a[i]-ASCII; k++; i--; } while(j>=0) //如果b的数位比a的位数多,这里就会大于0,就会像上面那个函数一样进行计算 { if(c[k]+b[j]-ASCII>9) { c[k]=(c[k]+b[j]-ASCII)%10; c[k+1]++; } else c[k]+=b[j]-ASCII; k++; j--; } printf("the result is :\n"); // 打印 the result is :\n printf("%s + %s =",a,b); // 打印两个加数的加法算式 if(c[k]==0) k--; //如果结果数组的最高位为0,就在数据中后退一位置,避免第一个字符打印出0 while(k>=0) // 从数组后面向前面打印, 如果k>=0 表示还没有打印完。 { printf("%d",c[k--]); //打印当前结果数组的值,并把位置向数组前推进,便于下一循环打印出高一位的值 } printf("\n"); for(p=0;p<1001;p++) //这个for 用于重置三个数组 { c[p]=0; a[p]=' '; b[p]=' '; } } return 0; } 减2的地方我是猜的,好像有个回车符,不知道它是不是算两个字符,还是其它什么原因。记不清楚了 |
求个详细的解释
#include <stdio.h>
#include<iostream>
using namespace std;
#define ASCII 48
int main()
{
int i,j,k,m=0,p;
char a[1001],b[1001];
int c[1001];
for(p=0;p<1001;p++)
{
c[p]=0;
a[p]=' ';
b[p]=' ';
}
while(cin>>a>>b)
{
i=0;
j=0;
k=0;
while(a[i]!=' ')
{
i++;
}
i=i-2;
while(b[j]!=' ')
{
j++;
}
j=j-2;
while(i>=0&&j>=0)
{
if(c[k]+a[i]-ASCII+b[j]-ASCII>9)
{
c[k]=(c[k]+a[i]+b[j]-2*ASCII)%10;
c[k+1]++;
}
else
c[k]+=a[i]+b[j]-2*ASCII;
k++;
i--;
j--;
}
while(i>=0)
{
if(c[k]+a[i]-ASCII>9)
{
c[k]=(c[k]+a[i]+b[j]-2*ASCII)%10;
c[k+1]++;
}
else
c[k]+=a[i]-ASCII;
k++;
i--;
}
while(j>=0)
{
if(c[k]+b[j]-ASCII>9)
{
c[k]=(c[k]+b[j]-ASCII)%10;
c[k+1]++;
}
else
c[k]+=b[j]-ASCII;
k++;
j--;
}
printf("the result is :\n");
printf("%s + %s =",a,b);
if(c[k]==0) k--;
while(k>=0)
{
printf("%d",c[k--]);
}
printf("\n");
for(p=0;p<1001;p++)
{
c[p]=0;
a[p]=' ';
b[p]=' ';
}
}
return 0;
}
文章有点长了,见谅哈。这个是我找到的一个关于无穷大的数相加的一个代码,但是我确实是不知道这些是什么意思。大数相加用ASCII的原理是什么。求人给这些代码来个很详细的解释。顺便说哈,为什么要这么做?