原题描述:
特大整数只能存入数组,下面就是我的将特大整数存入字符串数组并且得到两两相加和相减的结果的代码:
#include<stdio.h>
void jinwei(char *a,char *b)
{
int i=0,j=0,k=0,n,n1=0,n2=0,m,t,d[30],e[30],x,y,z,flag1=0,flag2=0,flag3=0;char c[30];
while(a[i]!='\0')
{
n1++;
i++;
}
i=0;
while(b[i]!='\0')
{
n2++;
i++;
}
if(n1==n2)
{
for(i=n1+1;i>=1;i--)
{
a[i]=a[i-1];
b[i]=b[i-1];
}
a[0]='0';
b[0]='0';
}
else if(n1>n2)
{
t=n1-n2+1;
for(i=n1+1;i>=1;i--)
{
a[i]=a[i-1];
}
a[0]='0';
for(i=n1+1;i>=t;i--)
{
b[i]=b[i-t];
}
for(i=0;i<t;i++)
{
b[i]='0';
}
}
n=n1+1;
for(i=n-1;i>=0;i--)
{
x=(a[i]-'0')+(b[i]-'0');
y=x%10;
z=x/10;
d[j++]=y+flag1;
if(z>0) flag1=1;
else flag1=0;
}
if(d[j-1]>0) printf("%d",d[j-1]);
for(i=j-2;i>=0;i--)
{
printf("%d",d[i]);
}
printf("\n");
}
void tuiwei(char *a,char *b)
{
int i=0,j=0,k=0,n,n1=0,n2=0,m,t,d[30],e[30],x,y,z,flag1=0,flag2=0,flag3=0;char c[30];
while(a[i]!='\0')
{
n1++;
i++;
}
i=0;
while(b[i]!='\0')
{
n2++;
i++;
}
if(n1==n2)
{
for(i=n1+1;i>=1;i--)
{
a[i]=a[i-1];
b[i]=b[i-1];
}
a[0]='0';
b[0]='0';
}
else if(n1>n2)
{
t=n1-n2+1;
for(i=n1+1;i>=1;i--)
{
a[i]=a[i-1];
}
a[0]='0';
for(i=n1+1;i>=t;i--)
{
b[i]=b[i-t];
}
for(i=0;i<t;i++)
{
b[i]='0';
}
}
n=n1+1;
for(i=n-1;i>=0;i--)
{
x=(a[i]-'0')-(b[i]-'0');
if(x<0)
{
y=flag2+x+10;
e[k++]=y;
flag2=-1;
}
else if(x==0)
{
if(flag2==-1)
{
y=flag2+x+10;
e[k++]=y;
flag2=-1;
}
else if(flag2==0)
{
y=flag2+x;
e[k++]=y;
flag2=0;
}
}
else
{
y=flag2+x;
e[k++]=y;
flag2=0;
}
}
for(i=k-1;i>=0;i--)
{
if(e[i]!=0)
{
m=i;
flag3=1;
break;
}
}
if(flag3!=1)
{
printf("0\n");
}
else
{
for(i=m;i>=0;i--)
{
printf("%d",e[i]);
}
printf("\n");
}
}
main()
{
int n,i;char a[40][40],b[40][40];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
scanf("%s",b[i]);
}
for(i=0;i<n;i++)
{
jinwei(a[i],b[i]);
}
for(i=0;i<n;i++)
{
tuiwei(a[i],b[i]);
}
}
这部分的理解可能需要大家拿笔在纸上画一画,演算一下会比较好理解,由于我主要是想把自己比赛的好题收集起来,所以具体的算法理解,可能只有靠大家了。