答疑:解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7761-1-1.html
思路:第一次做,麻蛋的没有考虑负数情况,结果就是推倒重来;把加减乘分别封装成函数,直接调用即可,参加运算有负数只需调换位置即可(教训:以后多用函数解决,这样对代码重构很有帮助);最后还是有问题,搞了半天才知道是对结果尾0就直接输出一个0就行。还有马丹的看了别人的代码,以前坚持C++的改用java了,就特么很气,自己终于用C++写出来了。
#include<iostream>#include<string>#include<cstring>#include<fstream>using namespace std;int a[405];//存放源操作数int b[405];//存放目的操作数int c[1000];//存放结果void add(int a[],int b[],int c[],int n1,int n2);//处理二数相加void sub(int a[],int b[],int c[],int n1,int n2);//处理二数相减void mult(int a[],int b[],int c[],int n1,int n2);//处理二数相乘int main(){ ifstream in; in.open("2.txt"); string str1,str2; while(in>>str1>>str2) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); int n1=str1.length(); int n2=str2.length(); for(int i=n1-1;i>=0;--i) a[i]=str1[n1-1-i]-'0'; for(int i=n2-1;i>=0;--i) b[i]=str2[n2-1-i]-'0'; if(a[n1-1]>=0 && b[n2-1]>=0)//二个数都是正数 { memset(c,0,sizeof(c)); add(a,b,c,n1,n2); memset(c,0,sizeof(c)); sub(a,b,c,n1,n2); memset(c,0,sizeof(c)); mult(a,b,c,n1,n2); }else if(a[n1-1]>=0 && b[n2-1]<0)//a为正数,b为负数 { memset(c,0,sizeof(c)); sub(a,b,c,n1,n2-1); memset(c,0,sizeof(c)); add(a,b,c,n1,n2-1); memset(c,0,sizeof(c)); cout<<"-"; mult(a,b,c,n1,n2-1); }else if(a[n1-1]<0 && b[n2-1]>=0)//a为负数,b为正数 { memset(c,0,sizeof(c)); sub(b,a,c,n2,n1-1); memset(c,0,sizeof(c)); cout<<"-"; add(a,b,c,n1-1,n2); memset(c,0,sizeof(c)); cout<<"-"; mult(a,b,c,n1-1,n2); }else //二个数均为负数 { memset(c,0,sizeof(c)); cout<<"-"; add(a,b,c,n1-1,n2-1); memset(c,0,sizeof(c)); sub(b,a,c,n2-1,n1-1); memset(c,0,sizeof(c)); mult(a,b,c,n1-1,n2-1); } } return 0;}void add(int a[],int b[],int c[],int n1,int n2){ int temp1=0; int temp2=0; int carry=0; int index=0; a[n1]=0; b[n2]=0; bool flag=false; while(temp1<n1 || temp2<n2) { c[index]=(a[index]+b[index]+carry)%10; carry=(a[index]+b[index]+carry)/10; ++index; ++temp1; ++temp2; } if(carry!=0) { cout<<carry; flag=true; } for(int i=index-1;i>0;--i)//对首位数是不是0进行判断和处理,很重要 { //之前一直通不过就是这个没有考虑 if(c[i]!=0 || flag==true) { cout<<c[i]; flag=true; } } cout<<c[0]<<endl;}void sub(int a[],int b[],int c[],int n1,int n2){ int temp1=0; int temp2=0; int index=0; int borrow=0; a[n1]=0; b[n2]=0; bool flag=false; while(temp1<n1 || temp2<n2) { if((a[index]-borrow)>=b[index]) { c[index]=a[index]-borrow-b[index]; borrow=0; } else { c[index]=a[index]-borrow+10-b[index]; borrow=1; } ++index; ++temp1; ++temp2; } int t; if(borrow==1)//对被减数小于减数进行处理 { cout<<"-"; borrow=0; for(int i=0;i<index;++i) { t=c[i]; c[i]=(10-borrow-c[i])%10;//这里的c[i]会被更改,所以要用中间变量t borrow=1-(10-borrow-t)/10; } } for(int i=index-1;i>0;--i)//对首位数是不是0进行判断和处理,很重要 { //之前一直通不过就是这个没有考虑 if(c[i]!=0 || flag==true) { cout<<c[i]; flag=true; } } cout<<c[0]<<endl;}void mult(int a[],int b[],int c[],int n1,int n2){ int i; int j; int temp; int carry; bool flag=false; for(i=0;i<n2;++i) { carry=0; for(j=0;j<n1;++j) { temp=c[i+j]; c[j+i]=(a[j]*b[i]+temp+carry)%10;//这里的c[i]会被更改,所以要用中间变量temp carry=(a[j]*b[i]+temp+carry)/10; } c[i+j]=carry; } if(carry!=0) { cout<<carry; flag=true; } for(int k=n1+n2-2;k>0;--k) { if(c[k]!=0 || flag==true) { cout<<c[k]; flag=true; } } cout<<c[0]<<endl;}
(2)来看看垃圾java版本吧import java.util.Scanner; import java.math.BigInteger; public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); while(in.hasNext()){ BigInteger a=in.nextBigInteger(); BigInteger b=in.nextBigInteger(); System.out.println(a.add(b)); System.out.println(a.subtract(b)); System.out.println(a.multiply(b)); } in.close(); } }