| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 1734 人关注过本帖
标题:整数高精度减法程序(相对完善)
只看楼主 加入收藏
wuhanzhou
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-1-19
  问题点数:0  回复次数:1   
整数高精度减法程序(相对完善)
在网上看到很多关于高精度减法程序,感觉都不是很完善,对于一些测试数据出现明显错误,比如:输入01 100 很显然应当输出-99而这些程序去没有考虑前置零的情况,再比如有些程序要求A-B时A>B必须成立,这是不好的,或者可以实现01-100=-99但是当结果出现前置零时又不能完善如000-99=-099就显得不太友好  -_-

  所以自己就做了一个功能相对完善的程序,自己还没有发现错误,在几个oj上运行也AC了,如果有一些错误希望各位学长学姐给小弟说下哈






//请最终劳动成果
#include "iostream"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
using namespace std;
//比较
int compare(char *s1,char *s2)
{
     int n=0;
     if(strlen(s1)<strlen(s2))
            return 0;
     if(strlen(s1)==strlen(s2))
     {
           for(int k=0;k<strlen(s1);k++)
               if(s1[k]<s2[k])
                    return 0;
               else if(s1[k]>s2[k])
                   return 1;
          return 2;
     }
     return 1;    
}
//减法
void sub(char s1[520],char s2[520],char back[520])
{
     char  Temp[520];
     int p,q,r;
     if(compare(s1,s2)==2)
     {
         back[0]='0';
         back[1]='\0';
         //puts(back);
         return ;
     }
     else
     {
         int n=0;
         p=strlen(s1),q=strlen(s2);
         if(p>q)
         {
            for(int k=0;k<p-q;k++)
                Temp[k]='0';
           for(int k=p-q;k<p;k++)
               Temp[k]=s2[n++];
         }
         else
            Temp[0]='\0',strcat(Temp,s2);
           for(n=p-1;n>=0;n--)
            {
                   if(s1[n]-Temp[n]>=0)
                       back[n]=s1[n]-Temp[n]+'0';
                   else
                     {
                         back[n]=s1[n]-Temp[n]+10+'0';
                         s1[n-1]-=1;
                     }
           }
        back[p]='\0';
        for(r=0;r<p;r++)
           if(back[r]!='0')
                break;
        for(n=0;r<p;r++)
            back[n++]=back[r];
        back[n]='\0';
               // puts(s1);puts(Temp);
               //puts(back);
        return ;
     }
}
//加法
 void add(char a[],char b[],char back[])
{
    int i,j,k,up,x,y,z,l;
    char *c;
    if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;
    c=(char *) malloc(l*sizeof(char));
    i=strlen(a)-1;
    j=strlen(b)-1;
    k=0;up=0;
    while(i>=0||j>=0)
        {
            if(i<0) x='0'; else x=a[i];
            if(j<0) y='0'; else y=b[j];
            z=x-'0'+y-'0';
            if(up) z+=1;
            if(z>9) {up=1;z%=10;} else up=0;
            c[k++]=z+'0';
            i--;j--;
        }
    if(up) c[k++]='1';
    i=0;
    c[k]='\0';
    for(k-=1;k>=0;k--)
        back[i++]=c[k];
    back[i]='\0';
}

//主程序
int main()
{
    char s1[520],s2[520],ch1,ch2,back[520];
    int sign1,sign2;
    while(scanf("%s%s",s1,s2)!=EOF)
    {
        back[0]='\0';
        int p=0,q=0;
        //符号初始化
        sign1=1,sign2=1;
        //获取符号
        ch1=s1[0]=='-'?'-':'+';
        ch2=s2[0]=='-'?'-':'+';
        //标记符号
        sign1=ch1=='+'?1:0;
        sign2=ch2=='+'?1:0;
        //被减数字符串处理
        for(int k=0;k<strlen(s1);k++)
            if(s1[k]>='0'&&s1[k]<='9')
                  s1[p++]=s1[k];
        s1[p]='\0';
        //减数字符串处理
        for(int k=0;k<strlen(s2);k++)
            if(s2[k]>='0'&&s2[k]<='9')
                  s2[q++]=s2[k];
        s2[q]='\0';
        //对被减数字符串存在前置零进行判断与处理
        p=0,q=0;
        for(q=0;q<strlen(s1)-1&&strlen(s1)>=2;q++)
             if(s1[q]!='0')
                   break;
        if(q>0)
           {
           for(;q<strlen(s1);q++)
             s1[p++]=s1[q];
           s1[p]='\0';
        }
       //对减数字符串存在前置零进行判断与处理
        p=0,q=0;
        for(q=0;q<strlen(s2)-1&&strlen(s2)>=2;q++)
             if(s2[q]!='0')
                   break;
        if(q>0)
        {
            for(;q<strlen(s2);q++)
             s2[p++]=s2[q];
            s2[p]='\0';
        }
        
        p=0,q=0;
        //当被减数为负数、减数为正数
        if(sign1==0&&sign2==1)
          {
                 add(s1,s2,back);
                 if(back[0]=='0');
                 else
                  printf("-");
               for(p=0;p<strlen(back);p++)
                    printf("%c",back[p]);
               printf("\n");
               continue;
          }
        //当被减数为正数、减数为负数
        if(sign1==1&&sign2==0)
          {
                 add(s1,s2,back);
               for(p=0;p<strlen(back);p++)
                    printf("%c",back[p]);
               printf("\n");
               continue;              
          }
        //当被减数与减数均为正数
        if(sign1==1&&sign2==1)
          {
                if(compare(s1,s2))
                  {
                    sub(s1,s2,back);
                    printf("%s\n",back);
                  }
                else
                  {
                     sub(s2,s1,back);
                     printf("-%s\n",back);
                    }
                 continue;
          }
        //当被减数与减数均为负数
        else
          {
                if(compare(s1,s2))
                 {
                    sub(s1,s2,back);
                    if(back[0]=='0')
                       printf("%s\n",back);
                    else
                       printf("-%s\n",back);
                 }
              else
                 {
                     sub(s2,s1,back);
                     printf("%s\n",back);
                 }
                 continue;
          }
    }
    return 0;
}




//说明:只需输入A B      输出A-B
搜索更多相关主题的帖子: ACM  
2009-08-13 11:34
漠漠残香
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-5-3
  得分:0 
有小数怎么破?
2015-09-24 19:45







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031159 second(s), 8 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved