标签:
算法思想:预处理输入的整数字符串,去掉开头的‘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