码迷,mamicode.com
首页 > 其他好文 > 详细

大整数减法(超过整形的表示范围)

时间:2016-01-16 21:05:39      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

算法思想:预处理输入的整数字符串,去掉开头的‘0’,然后减法操作,减法操作过程中,如果被减数小于减数,则交换两个数 赋值给被减数和减数变量,始终保持 大数减小数。最后 再 根据 是否交换赋值 来 确定正负。

代码实现:

  1 #include<iostream>
  2 #include<string>
  3 using namespace std;
  4 
  5 //去掉字符开头的0
  6 void processStr(string &str)
  7 {
  8     if(str.size()<=0)
  9         return;
 10     int len=str.size();
 11     int i;
 12     for(i=0;i<len&&str[i]==0;i++);
 13 
 14     str=str.substr(i,len-i);
 15             
 16 }
 17 
 18 //减法函数实现
 19 void bigIntSubtract(string strA,int lenA,string strB,int lenB,char* res,int lenRes)
 20 {
 21     //无效输入
 22     bool InvaildInput=false;
 23     if(lenA<=0||lenB<=0)
 24     {
 25         InvaildInput=true;
 26         return;
 27     }
 28     InvaildInput=false;
 29 
 30     //确定减数和被减数
 31     string subtrahend=strA;//被减数
 32     string subtracter=strB;//减数
 33 
 34     if(lenB>lenA)
 35     {
 36         subtrahend=strB;
 37         subtracter=strA;
 38     }
 39     if(lenA==lenB)//长度相等时,判断大小
 40     {
 41         if(strA>strB)
 42         {
 43             subtrahend=strA;
 44             subtracter=strB;
 45         }
 46         else if(strA<strB)
 47         {
 48             subtrahend=strB;
 49             subtracter=strA;
 50         }
 51         else
 52             return;
 53     }
 54     
 55     //减法运算
 56     int lenL=subtrahend.size();
 57     int lenS=subtracter.size();
 58     int flag=0;//标记是否借位
 59     int num=0;//存放减法操作中间数
 60 
 61     int iL=lenL-1,iS=lenS-1,iR=lenRes-2;//注意 iR的初始值,因为 下标和\0
 62     for(;iL>=0&&iS>=0&&iR>=0;iL--,iS--,iR--)
 63     {
 64         num=subtrahend[iL]-0-(subtracter[iS]-0)-flag;
 65         if(num>=0)
 66         {
 67             res[iR]=num+0;
 68             flag=0;
 69         }
 70         else
 71         {
 72             res[iR]=10+num+0;
 73             flag=1;
 74         }
 75         
 76     }
 77 
 78     if(1==flag)//中间出现借位,12345-789这种情况
 79         res[iR--]=subtrahend[iL--]-flag;
 80 
 81     while(iL>=0)//长的减短的,长的剩余部分直接拷贝
 82     {
 83         res[iR--]=subtrahend[iL--];
 84     }
 85 
 86     if(subtrahend==strB)//交换存放,即为负
 87         res[iR]=-;
 88     else res[iR]=+;
 89 
 90     return;
 91 }
 92 
 93 void main()
 94 {
 95     string strA,strB;
 96 
 97     cout<<"input strA"<<endl;
 98     cin>>strA;
 99     cout<<"input strB"<<endl;
100     cin>>strB;
101 
102     processStr(strA);//去掉数字开始的0,例如000123变成123
103     processStr(strB);
104     
105     //存储结果数组,申请及初始化
106     int lenA=strA.size();
107     int lenB=strB.size();
108     int lenRes=lenA>=lenB? (lenA+2):(lenB+2);
109 
110     char * res=new char[lenRes];
111     memset(res,0,lenRes*sizeof(char));
112     res[lenRes-1]=\0;
113 
114     //减法函数调用
115     bigIntSubtract(strA,lenA,strB,lenB,res,lenRes);
116     
117     //+0123或00123或000 \0 情况处理
118     while((*res==+||*res==0)&&*res!=\0)
119         res++;
120 
121     //如果全零情况
122     if(*res==\0)
123     {
124         cout<<"The result is: "<<0<<endl;
125         system("pause");
126         return;
127     }
128 
129     cout<<"The result is: "<<res<<endl;
130     system("pause");
131     return;
132 }

 

大整数减法(超过整形的表示范围)

标签:

原文地址:http://www.cnblogs.com/spun-sugar/p/5136311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!