菜鸟BIT程序设计课A题日志第二周

从第一周开始我就有那么点因虚荣而后怕——这日志接不下去不悲剧了。果然,这一周题的难度飙升程度对于菜鸟我来说实在有点大。

第五题一点都不未雨绸缪的高精度运算。

算法到处都看得到,而且只是加减与正整数,所以说弱爆了啊!!!一点都不未雨绸缪搞得第七题重用就是水中月。但是开题之前在软院做得时候还是调了一天(可惜软院现在关闭了哇啊,悲催没有狠下心多做点当时,不过现在还是残留着题和讨论区~你懂的):

 

计算机所能完成的一个基本功能就是完成数据的计算,譬如加法、减法等等。但是在任何一种计算机上,计算中能够使用的数字都是有一定范围的,超过了范围,就没法得到精确的结果。

你现在接受了一个任务,要编写一个高精度计算器的核心部分。所谓高精度计算器,就是可以计算很大很大的数据的计算器。而你所需要编写的程序,就是真正完成高精度加法和高精度减法运算的两个函数,因为程序其它的部分已经由别人编写好了。

函数的输入、输出接口也已经定义完成,譬如 plus() 函数,它有三个参数 a、b 和 c,都是 char * 类型。a 和 b 分别是参加运算的两个整数,而 c 用来存放运算的结果。所有的数字都是以字符串的形式保存的。

注意,只需提交你自己编写的两个函数。

输入

输入的每一行是两个十进制的正整数和一个运算符,每个整数可以由最多 500 个数字组成。运算符可以是加号或者减号。

输出

对应着输入的每一行数据,输出计算的结果,每个结果占一行。

#include
#include

void plus(char *a, char *b, char *c);
void minus(char *a, char *b, char *c);

int main()
{      
    char a[1000];
    char b[1000];
    char c[1000];
    char s[2];

    while (scanf("%s %s %s\n", a, s, b) == 3) {
        if (s[0] == '+') {
            plus(a, b, c);
        } else if (s[0] == '-') {
            minus(a, b, c);
        }
        printf("%s\n", c);
    }

    return 0;
}

 

void plus(char *a, char *b, char *c){
 int i=0,j=0,k=0,max=0,min=0,temp=0;
 char *pmax,*pmin;
 memset(c,0,sizeof(c));
 c[0]='0';
 max=strlen(a);
 min=strlen(b);
 if (max   pmax=b;
  pmin=a;
  temp=max;
  max=min;
  min=temp;
 }
 else{
  pmax=a;
  pmin=b;
 }
 for (i=min-1,j=max-1,k=max;i>=0;i--,j--,k--)
  c[k]=pmin[i]-'0'+pmax[j];
 if(j>=0)
  for (;j>=0;j--,k--)
   c[k]=pmax[j];
  for (i=max;i>=0;i--) {  
   if (c[i]>'9')
   {
    c[i]=c[i]-10;
    c[i-1]++;
   }
  }
        if (c[0]=='0'){  
            for (i=1;i<=max;i++)  
                c[i-1]=c[i];   
            c[i-1]='\0';   
        }  
        else{   
            for (i=0;i<=max;)   
    i++;
            c[i]='\0'; 
  }
  for(i=0;i    if(c[i]!='0')
    break;
   max=strlen(c)-i;
  }
  if(c[0]=='0'){
   for(j=0;j     c[j]=c[i];
   }
  }
}
void minus(char *a, char *b, char *c){
 int i,j,la,lb;
 for(i=0;i   if(a[i]!='0')
   break;
  la=strlen(a)-i;
 }
 if(a[0]=='0'){
  for(j=0;j    a[j]=a[i];
  }
  }
 for(i=0;i   if(b[i]!='0')
   break;
  la=strlen(b)-i;
 }
 if(b[0]=='0'){
  for(j=0;j    b[j]=b[i];
  }
  }
 la=strlen(a);
 lb=strlen(b);
 if (la>lb||(la==lb&&strcmp(a,b)>=0)){
  for (i=la-1,j=lb-1;j>=0;i--,j--)
   a[i]=a[i]-(b[j]-'0');
  for (i=la-1;i>=0;i--)
   if (a[i]<'0'){
    a[i]+=10;
    a[i-1]--;
   

你可能感兴趣的:(ACM)