不会的迟早要补回来的!下面是C++大数操作。放这里纪念一下,水平不高,大家别取笑~
- #include <iostream>
- #include <string>
- #include <vector>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- #define MAX 1000
- string intToString(int n)
- {
- string result;
- char ch[MAX];
- sprintf(ch,"%d",n);
- result=ch;
- return result;
- }
- //比较数字str1 和 str2 谁大,
- int whobigger(string str1,string str2)
- {
- if(str1==str2)
- return 0;
- if(str1.size() > str2.size())
- return -1;
- if(str1.size() < str2.size())
- return 1;
- if(str1.size() == str2.size())
- for(int i=0;i<str1.size();i++)
- {
- if(str1.at(i)>str2.at(i))
- return -1;
- else if(str1.at(i) < str2.at(i))
- return 1;
- else
- continue;
- }
- return 0;
- }
- string add(string str1,string str2)
- {
- int i;
- if(str1.size()==1 && str2.size()==1 && str1.at(0)=='0' && str2.at(0)=='0')
- return "0";
- if(str1.size() < str2.size())
- swap(str1,str2);
- vector<int> num1,num2;
- for(i=str1.size()-1;i>=0;i--)
- num1.push_back(str1.at(i)-'0');
- for(i=str2.size()-1;i>=0;i--)
- num2.push_back(str2.at(i)-'0');
- for(i=0;i<3;i++)
- num1.push_back(0);
- //以长度短的数开始做加法
- for(i=0;i<str2.size();i++)
- {
- num1[i] += num2[i];
- if(num1[i]>=10)
- {
- num1[i] -= 10;
- num1[i+1]++;
- }
- }
- //调整str1
- for(;i<str1.size();i++)
- if(num1[i]>=10)
- {
- num1[i] -= 10;
- num1[i+1]++;
- }
- //把数字前面的0滤掉
- string result;
- bool flag=0;
- for(i=num1.size()-1;i>=0;i--)
- if(num1.at(i)!=0||flag)
- {
- flag=1;
- result += num1.at(i)+'0';
- }
- return result;
- }
- //str1>str2的情况
- string minu(string str1,string str2)
- {
- vector<int> num1,num2;
- for(int i=str1.size()-1;i>=0;i--)
- num1.push_back(str1.at(i)-'0');
- for(int i=str2.size()-1;i>=0;i--)
- num2.push_back(str2.at(i)-'0');
- for(int i=0;i<num2.size();i++)
- {
- if(num1.at(i)-num2.at(i)<0)
- {
- num1[i] +=10;
- num1[i+1]--;
- }
- num1[i] -= num2[i];
- }
- //把数字前面的0滤掉
- string result;
- bool flag=0;
- for(int i=num1.size()-1;i>=0;i--)
- if(num1.at(i)!=0||flag)
- {
- flag=1;
- result += num1.at(i)+'0';
- }
- return result;
- }
- //减法
- string minus(string str1,string str2)
- {
- if(whobigger(str1,str2)==0)//相等
- return "0";
- else if(whobigger(str1,str2)==-1)//str1>str2
- return minu(str1,str2);
- else //str1<str2
- {
- swap(str1,str2);
- string res= "-"+minu(str1,str2);
- return res;
- }
- }
- //乘法
- string mul(string str1,string str2)
- {
- if(str1.size()==1 && str1.at(0)=='0' || str2.size()==1 && str2.at(0)=='0')
- return "0";
- int res[MAX];
- memset(res,0,sizeof(res));
- if(str1.size() < str2.size())
- swap(str1,str2);
- vector<int> num1,num2;
- for(int i=str1.size()-1;i>=0;i--)
- num1.push_back(str1.at(i)-'0');
- for(int i=str2.size()-1;i>=0;i--)
- num2.push_back(str2.at(i)-'0');
- //进行乘法运算,关键步骤是 res[i+j]+=num1.at(j)*num2.at(i);
- for(int i=0;i<num2.size();i++)
- for(int j=0;j<num1.size();j++)
- res[i+j]+=num1.at(j)*num2.at(i);
- //处理进位
- for(int i=0;i<MAX;i++)
- if(res[i]>=10)
- {
- res[i+1] += res[i]/10;
- res[i] = res[i]%10;
- }
- //把数字前面的0滤掉
- string result;
- bool flag=0;
- for(int i=MAX-1;i>=0;i--)
- if(res[i]!=0 || flag)
- {
- flag=1;
- result += res[i] + '0';
- }
- return result;
- }
- //除法
- string div(string str1,string str2)
- {
- string res="0";
- if(str1 == "0")
- return "0";
- if(whobigger(str1,str2)==1 || str2=="0")//str1<str2
- return "error";
- while(str1!="0")
- {
- int dif=str1.size()-str2.size();//需要后补0的个数
- //相当于给str2补零进行计算
- string tstr2=str2;
- for(int i=1;i<=dif;i++)
- tstr2+="0";
- if(whobigger(str1,tstr2)==1)//补零后大于被除数
- {
- dif--;
- //去掉一个0
- tstr2.erase(tstr2.size()-1);
- }
- int count=0;
- //循环做减法,并记下减法的次数
- while(whobigger(str1,tstr2)!=1)//str1 ==str2 或者 str1 > str2
- {
- str1=minus(str1,tstr2);
- count++;
- }
- string count0=intToString(count);
- for(int i=1;i<=dif;i++)
- count0+='0';
- res = add(res,count0);
- }
- return res;
- }
- int main()
- {
- while(1)
- {
- string str1,str2;
- cout<<"input num1:";
- cin>>str1;
- cout<<"input num2:";
- cin>>str2;
- cout<<"add result="<<div(str1,str2)<<endl;
- cout<<"------------------------------"<<endl;
- }
- return 0;