杭电ACM1002

  • 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;
}

以上代码由于节省了空间,所以对各变量的控制会显得比较晦涩难懂,各部分间的联系比较复杂,在输出部分也可以再通过原来数组的最大有效长度,来减少循环次数,不过作用不大,而且会让人更难看懂.本题重点在于是否掌握高精度的算方法,此题是最基本的加法运算,而且不涉及小数,所以难度较低.除法的话,是比较困难的

百分购

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: