应一位网友要求写的个程序,如有朋友发现有错欢迎指出:
#include <iostream>
#include <string>using namespace std;
#define LEN 30
void sub(char str11[],char str22[],char str33[]);
void removeZero(char str[]);
bool smallThan(char str1[],char str2[])
{
if(strlen(str1)<strlen(str2))return true;
if(strlen(str1)>strlen(str2))return false;
int i = 0;
while(str1[i]!='\0'){
if(str1[i]>str2[i])return false;
else if(str1[i]<str2[i])return true;
i++;
}
return false;
}
void add(char str11[],char str22[],char str33[])
{
// cout<<str11<<"+"<<str22<<endl;
int i;
char str1[LEN],str2[LEN],str3[LEN+1];
if(str11[0]!='-')
strcpy(str1,str11);
else{
for(i=1;i<=strlen(str11);i++)str1[i-1]=str11[i];
}
if(str22[0]!='-')
strcpy(str2,str22);
else{
for(i=1;i<=strlen(str22);i++)str2[i-1]=str22[i];
}
if(str11[0] == '-' && str22[0] == '-'){
add(str1,str2,str3);
for(i=0;i<=strlen(str3);i++)
str33[i+1]=str3[i];
str33[0]='-';
return;
}
if(str11[0] == '-' && str22[0] != '-'){
sub(str2,str1,str33);
return;
}
if(str22[0] == '-' && str11[0] != '-'){
sub(str1,str2,str33);
return;
}
//str1倒过来,个位在前面
for(i=0;i<strlen(str1);i++)
str3[i] = str1[strlen(str1)-1-i];
for(i=0;i<strlen(str1);i++)
str1[i] = str3[i];
//str2倒过来,个位在前面
for(i=0;i<strlen(str2);i++)
str3[i] = str2[strlen(str2)-1-i];
for(i=0;i<strlen(str2);i++)
str2[i] = str3[i];
//相加
int t = 0; //进位
for(i=0;;i++)
{
if(i>strlen(str1) && i>strlen(str2))break;
int c = t;
if(i<strlen(str1))c += str1[i]-'0';
if(i<strlen(str2))c += str2[i]-'0';
t=c/10;
c=c%10;
str3[i] = '0'+c;
}
if(t)str3[i++] = '0'+t;
str3[i]='\0';
for(i=0;i<strlen(str3);i++)
str33[i]=str3[strlen(str3)-1-i];
str33[strlen(str3)]='\0';
}
void sub(char str11[],char str22[],char str33[])
{
// cout<<str11<<"-"<<str22<<endl;
int i;
char str1[LEN],str2[LEN],str3[LEN+1];
if(str11[0]!='-')
strcpy(str1,str11);
else{
for(i=1;i<=strlen(str11);i++)str1[i-1]=str11[i];
}
if(str22[0]!='-')
strcpy(str2,str22);
else{
for(i=1;i<=strlen(str22);i++)str2[i-1]=str22[i];
}
removeZero(str1);
removeZero(str2);
if(str11[0] == '-' && str22[0] == '-'){
sub(str2,str1,str33);
return;
}
if(str11[0] == '-' && str22[0] != '-'){
add(str1,str2,str3);
for(i=0;i<=strlen(str3);i++)
str33[i+1]=str3[i];
str33[0]='-';
return;
}
if(str22[0] == '-' && str11[0] != '-'){
add(str1,str2,str33);
return;
}
//比较大小
if(smallThan(str1,str2)){
sub(str2,str1,str3);
for(i=0;i<=strlen(str3);i++)
str33[i+1]=str3[i];
str33[0]='-';
return;
}
//cout<<str1<<"-"<<str2<<endl;
//str1倒过来,个位在前面
for(i=0;i<strlen(str1);i++)
str3[i] = str1[strlen(str1)-1-i];
for(i=0;i<strlen(str1);i++)
str1[i] = str3[i];
//str2倒过来,个位在前面
for(i=0;i<strlen(str2);i++)
str3[i] = str2[strlen(str2)-1-i];
for(i=0;i<strlen(str2);i++)
str2[i] = str3[i];
//相减
int t = 0; //借位
for(i=0;;i++)
{
if(i>=strlen(str1) && i>=strlen(str2))break;
int c = 0;
if(i<strlen(str1))c += str1[i]-'0';
if(i<strlen(str2))c -= str2[i]-'0';
c-=t;
if(c>=0)t=0;
else{
t=1;
c=c+10;
}
str3[i] = '0'+c;
}
str3[i]='\0';
for(i=0;i<strlen(str3);i++)str33[i]=str3[strlen(str3)-1-i];
str33[i]='\0';
}
void removeZero(char str[])
{
int i=0,j,k;
if(str[0]=='-')i=1;
for(j=i;str[j]=='0';j++);
for(k=0;str[j]!='\0';j++,k++)
str[i+k]=str[j];
if(k == 0){str[0]='0';k++;i=0;}
str[i+k]='\0';
}
int main ()
{
char str1[LEN],str2[LEN],str3[LEN+1],str4[LEN+1];
cin>>str1>>str2;
add(str1,str2,str3);
removeZero(str3);
cout<<str1<<"+"<<str2<<"="<<str3<<endl;
sub(str1,str2,str4);
removeZero(str4);
cout<<str1<<"-"<<str2<<"="<<str4<<endl;
return 0;
}
------------------------------------------------
一些可供测试的例子:(有比较好的测试用例欢迎留言分享)
正负性测试
1 1
1 -1
-1 1
-1 -1
0测试
0 1
-1 0
相同数字
888 888
不规范输入
01 200
第一个大,第二个大
10 1000
1000 10
加减尾数为0有进位
9888 89888
77 88
44 56
9999999999 1
超过整型范围
102222299887 18389377999