题目一``:大整数加法
题目描述:
计算两个大整数的和。大整数是指超过了c,c++表示范围的整数,如1234567890000000000000000000
输入:
输入包括两个大整数,每个大整数不超过100位,用空格或者换行隔开
输出:
输出两个大整数的和
样例输入:
222222222222222222222
333333333333333333333
样例输出:
555555555555555555555
#include<stdio.h>
#include<string.h>
#define listsize 100
typedef struct
{
char data1[listsize];
int a1[listsize];
int length1;
char data2[listsize];
int a2[listsize];
int length2;
int result[listsize+1];
int resultlength;
}list;
void creat(list &L)
{
gets(L.data1);
L.length1=strlen(L.data1);
gets(L.data2);
L.length2=strlen(L.data2);
for(int i=0,j=L.length1-1 ;j>=0;)
L.a1[i++] =L.data1[j--] -'0';
for(int i=0,j=L.length2-1 ;j>=0;)
L.a2[i++] =L.data2[j--] -'0';
}
void add(list &L)
{
int i;
int flag[listsize]={0};
int big_length=L.length1;
if(big_length<L.length2) big_length=L.length2 ;
for(i=0;i<listsize;i++)
L.result[i]=0;
if(L.length1 <L.length2 )
{
for(i=0;i<=L.length1-1 ;i++)
{
if(i==0)
{
L.result [0]=(L.a1 [0]+L.a2 [0])%10;
flag[1]=(L.a1 [0]+L.a2 [0])/10;
}
else if(i>0)
{
L.result [i]=(flag[i]+L.a1 [i]+L.a2 [i])%10;
flag[i+1]=(flag [i]+L.a1 [i]+L.a2 [i])/10;
}
}
for(i=L.length1;i<=L.length2-1 ;i++)
{
L.result [i]=( flag[i]+L.a2 [i])%10;
flag[i+1]=(flag [i]+L.a2 [i])/10;
if(i==L.length2 -1)
L.result [i+1]=flag[i+1];
}
}
else if(L.length1 ==L.length2 )
for(i=0;i<=L.length1-1 ;i++)
{
L.result [i]+=(L.a1 [i]+L.a2 [i])%10;
L.result [i+1]+=(L.a1 [i]+L.a2 [i])/10;
}
else
{
for(i=0;i<=L.length2-1 ;i++)
{
if(i==0)
{
L.result [0]=(L.a1 [0]+L.a2 [0])%10;
flag[1]=(L.a1 [0]+L.a2 [0])/10;
}
else if(i>0)
{
L.result [i]=(flag[i]+L.a1 [i]+L.a2 [i])%10;
flag[i+1]=(flag [i]+L.a1 [i]+L.a2 [i])/10;
}
}
for(i=L.length2;i<=L.length1-1 ;i++)
{
L.result [i]=(flag [i]+L.a1 [i])%10;
flag [i+1]=(flag [i]+L.a1 [i])/10;
if(i==L.length1 -1)
L.result [i+1]=flag[i+1];
}
}
if(L.result [big_length]!=0)
L.resultlength =big_length+1;
else
L.resultlength =big_length;
}
void result(list &L)
{
int i;
for(i=L.resultlength-1;i>=0;i--)
printf("%d",L.result[i]);
}
int main()
{
list L;
creat(L);
add(L);
result(L);
return 0;
}
题目二:一元多项式的求和
题目描述:一个一元多项式可以看作由若干个一元单项式按降幂排列成的线性表。请编写程序对输入的两个一元多项式求和,并输出求和的结果
输入:输入为两个一元多项式,每个一元多项式输入一行,按照降幂依次输入每个单项式的系数和指数,并以-1 -1作为结束。系数和指数均为整数,指数不小于0。
输出:输出为求和结果多项式,按照降幂依次输出每个单项的系数和指数,每个数值后面用一个空格隔开,输出结果多项式后换行。
系数为0的单项式不得输出——除非结果多项式就是0,则直接输出0。
样例输入:2 7 3 5 12 1 6 0 -1 -1
7 5 9 4 3 0 -1 -1
样例输出:2 7 10 5 9 4 12 1 9 0
#include<stdio.h>
#define listsize 100
typedef struct {
int n[listsize];
int length;
}list;
void intput(list &a,list &b)
{
a.length =0;
b.length =0;
int i;
for(i=0;i<listsize;i+=2)
{
scanf("%d%d",&a.n[i],&a.n[i+1]);
a.length+=2;
if(a.n [i]==-1&&a.n [i+1]==-1)
{
a.length -=2;
break;
}
}
for(i=0;i<listsize;i+=2)
{
scanf("%d%d",&b.n[i],&b.n[i+1]);
b.length+=2;
if(b.n [i]==-1&&b.n [i+1]==-1)
{
b.length -=2;
break;
}
}
if(a.length ==0)
{
a.length =2;
a.n [0]=0;a.n [1]=0;
}
if(b.length ==0)
{
b.length =2;
b.n [0]=0;b.n [1]=0;
}
}//OK
void bdelete(list &b,int location)
{
int i;
for(i=location-1;i<b.length-1;i++)
{
b.n [i]=b.n [i+1];
}
b.length --;
}
void add(list &a,list &b)
{
int i,j;
int flag=0;
int m=a.length ,n=b.length ;
for(i=0;i<m;i+=2)
{
for(j=0;j<n;j+=2)
{
if(a.n [i+1]>b.n [j+1])
{
printf("%d %d ",a.n [i],a.n [i+1]);
flag++;
break;
}
else if(a.n [i+1]<b.n [j+1])
{
printf("%d %d ",b.n [j],b.n [j+1]);
flag++;
bdelete(b,j);
bdelete(b,j+1);
i-=2;
break;
}
else if(a.n [i+1]==b.n [j+1])
{
if(a.n [i]+b.n[j]==0)
printf("");
else
{
printf("%d %d ",a.n [i]+b.n [j],a.n [i+1]);
flag++;
}
bdelete(b,j);
bdelete(b,j+1);
break;
}
}
}
if(flag==0)
printf("0\n");
}
int main()
{
list a,b;
intput(a,b);
add(a,b);
return 0;
}