- A+
所属分类:ACM
杭电ACM1002
#include <stdio.h>
#include <string.h>
int main()
{
char a[1001]={0};
int c[1005]={0};
int l,t;
int i,j;
int k;
int T;
t=1;
scanf("%d",&T);
while (T--)
{
k=0;
for (i=0;i<1005;i++)
{
c[i]=0;//清零操作
}
if (t!=1)
{
printf("\n");//控制格式
}
scanf("%s",a);
/*用gets()读入的话,会因为gets()是以回车键作为结束标志而出现错误*/
printf("Case %d:\n%s +",t++,a);
l=strlen(a);
for(i=l-1,j=1004;i>=0;i--,j--)
{
c[j]=a[i]-'0';//直接转化为整型数,并从尾对齐
}
scanf("%s",a);
printf(" %s = ",a);
l=strlen(a);
/*高精度加法的精华*/
for(i=l-1,j=1004;i>=0;i--,j--)
{
c[j]+=a[i]-'0';
c[j-1]+=c[j]/10;
c[j]=c[j]%10;
}
/*输出格式控制*/
for (i=0,j=0;i<1005;i++)
{
if ((c[i]==0)&&(k==0))
{
j++;//用于判断是否全为0
}
else
{
printf("%d",c[i]);//从非零首项开始输出
k=1;//表示首项之后的数
}
}
/*特殊情况处理*/
if (j==1005)
{
printf("0");//等于零的情况
}
printf("\n");
}
return 0;
}
以上代码由于节省了空间,所以对各变量的控制会显得比较晦涩难懂,各部分间的联系比较复杂,在输出部分也可以再通过原来数组的最大有效长度,来减少循环次数,不过作用不大,而且会让人更难看懂.本题重点在于是否掌握高精度的算方法,此题是最基本的加法运算,而且不涉及小数,所以难度较低.除法的话,是比较困难的