高精度减法算法
来源:互联网 发布:微信打不开淘宝客链接 编辑:程序博客网 时间:2024/06/04 19:49
#include <iostream>#include <cstring>using namespace std;void sub( char*str1,char* str2,char* c) //c返回结果{ int flag=1; //1表示被减数str1大于减数str2,-1相反结果前要有负号 int i,j; int len1=strlen(str1); int len2=strlen(str2); int max=len1>len2?len1:len2; char *tmp; if(len1<len2) flag=-1; else { if(len1==len2&&str1<str2) flag=-1; } if(flag==1) //被减数长度大于减数长度,方便运算,要进行右对齐,减数前补0填充 { j=len1-1; for(i=len2-1;i>=0;i--) { str2[j--]=str2[i]; } str2[len1]='\0'; for(i=j;i>=0;i--) str2[i]='0'; } else //减数长度大于被减数 { j=len2-1; for(i=len1-1;i>=0;i--) { str1[j--]=str1[i]; } str1[len2]='\0'; for(i=j;i>=0;i--) str1[i]='0'; } cout<<"str1:"<<str1<<endl; cout<<"str2:"<<str2<<endl; int carry=0; if(flag==-1) { tmp=str1; str1=str2; str2=tmp; } for(i=max-1;i>=0;i--) //每位进行减法运算 { c[i]=(str1[i]-'0')-(str2[i]-'0')-carry+'0'; if(c[i]-'0'<0) { c[i]=c[i]+10; carry=1; } else { carry=0; } } int pos=0; i=0,j=0; while(c[pos]-'0'==0) pos++; if(pos==0&&flag==-1) //结果是负数要添负号 { for(i=max-1;i>=0;i--) c[i+1]=c[i]; c[0]='-'; c[max+1]='\0'; } else { if(flag==-1) { j=1; for(i=pos;i<max;i++) c[j++]=c[i]; c[j]='\0'; c[0]='-'; } else { j=0; for(i=pos;i<max;i++) c[j++]=c[i]; c[j]='\0'; } }}int main(){ char str1[30],str2[30]; char res[30]; while(cin>>str1>>str2) { sub(str1,str2,res); cout<<res; cout<<endl; }}