大数加法(使用结构体)
各位脱发友们:
在这里发表一个令我这个新手抓发的题目,虽然解出来但没有成就感的题目。
大数是算法语言中数据类型无法表示的数,所以处理大数问题时首先要考虑怎样存储大数。
一般情况下大数是采用数组来存储。例如:
下标0位置存储大数的低位,还需要一个整数记录大数有多少位,即length。可以考虑这样的结构(顺序表):
#define Maxsize 100
typedef struct list {
int data[Maxsize];
int length;
} SeqList;
A+B
有一个非常简单的问题给你,给你两个整数A和B,你的任务是计算A+B。
输入:输入的第一行包含一个整数T(T<=20)表示测试实例的个数,然后2*T行,分别表示A和B两个正整数。注意整数非常大,那意味着你不能用32位整数来处理。你可以确定的是整数的长度不超过1000。
输出:对于每一个样例,你应该输出两行,第一行是"Case #:",#表示第几个样例,第二行是一个等式"A+B=Sum",Sum表示A+B的结果。注意等式中有空格。
输入样例:
2
1
2
112233445566778899
998877665544332211
输出样例:
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
#include<stdio.h>
#include<string.h>
#define Z 200
typedef struct List
{
int data[Z];
int length;
}Number;
Number Search(char c[],Number num);
int main()
{
int T;
Number num1,num2;
char m[Z],n[Z];
int a[Z],b[Z][Z];
int len1,len2,l[Z];
int i,j,k,d;
scanf("%d",&T);
for(i=0;i<T;i++)
{
d=0;
scanf("%s",m); //以字符型输入大数
scanf("%s",n);
num1=Search(m,num1); //判断大数位数以及倒叙转换数组
num2=Search(n,num2);
len1=num1.length;
len2=num2.length;
if(len1>len2) k=len1; // 找到计算的位数
else k=len2;
for(j=0;j<k;j++)
for(j=0;j<k;j++)
{
a[j]=num1.data[j]+num2.data[j]+d;
d=a[j]/10;
a[j]=a[j]%10;
}
if(d!=0) //确定大数位数
{
a[k]=d;
l[i]=k+1;
}
else l[i]=k;
for(j=0;j<l[i];j++)
b[i][j]=a[j];
for(i=0;i<T;i++)
{
for(j=l[i]-1;j>=0;j--) //将大数以数组形式输出
printf("%d",b[i][j]);
printf("\n");
}
}
return 0;
}
Number Search(char c[],Number num)
{
int i=0,j=0;
num.length=strlen(c);
for(i=0,j=num.length-1;i<num.length,j>=0;i++,j--) //倒叙存入数组
{
num.data[i]=c[j]-'0';
}
return num;
}
其实在这里我在将数字重新转换为字符上浪费了老鼻子力气,结果还是没成功,后来想了想,可以直接转换为数字数组输出,稍稍的妥协一下吧–__–!