大整数四则运算

  1.     
  2. 1. 输入形式为:A[空格或换行]O[空格或换行]B;    
  3.  2. 1中A、B为大数,O为运算符(如输入:123456789 / 432432);    
  4.  3. 既然处理大数,就没必要输入小数点位了;    
  5.  4.加减不能处理负号,乘除可以;    
  6.  5. 用于学习交流,若发现错误或不妥之处可联系   
  7.     
  8. #include<iostream>    
  9. #include<string>    
  10. using namespace std;    
  11. class BigFigure{    
  12.     string num1,num2;    
  13.     string outcome;    
  14.     int precision;    
  15.     char operation;    
  16. public:    
  17.     BigFigure(){    
  18.         num1=num2="0";    
  19.         outcome="0";    
  20.         precision=5;    
  21.     }    
  22.     string& plus(string &, string &);    
  23.     string& subtration(string &, string &);    
  24.     string& multiplication(string &, string &);    
  25.     string& division(string &, string &);    
  26.     void show();    
  27.     void BigFigureInterface();    
  28.     string &revese(string&);    
  29.     friend istream& operator>>(istream& i, BigFigure& a){    
  30.          return i>>a.num1>>a.operation>>a.num2;    
  31.     }    
  32.     ~BigFigure(){ }    
  33. };    
  34. void BigFigure::show(){    
  35.     cout<<"Result: "<<outcome<<endl;    
  36. }    
  37. void BigFigure::BigFigureInterface(){    
  38.     BigFigure a;    
  39.     cout<<"*********************************************************/n";    
  40.     cout<<"      Welcome...                                     /n";    
  41.     cout<<"            Four Arithmetic Operations of Big Figures/n";    
  42.     cout<<"*********************************************************/n/n";    
  43.     cout<<"Notes:/n";    
  44.     cout<<"       1. 输入形式为:A[空格或换行]O[空格或换行]B。/n";    
  45.     cout<<"       2. 1中A、B为大数,O为运算符(如输入:123456789 / 432432)。/n";    
  46.     cout<<"       3. 既然处理大数,就没必要输入小数点位了。/n";    
  47.     cout<<"       4. 加减不能处理负号,乘除可以。/n";    
  48.     cout<<"       5. 用于学习交流,若发现错误可联系519916178@qq.com。/n/n";    
  49.     cout<<"Now Start, Input 0 0 0 to end if you want to quit!/n/n";    
  50.     cout<<"[BigFigure #] ";    
  51.     cin>>a;    
  52.     while(a.operation!='0'){    
  53.         switch(a.operation){    
  54.             case '+': a.plus(a.num1, a.num2);    
  55.                       a.show(); break;    
  56.             case '-': a.subtration(a.num1, a.num2);    
  57.                       a.show(); break;    
  58.             case '*': a.multiplication(a.num1, a.num2);    
  59.                       a.show(); break;    
  60.             case '/': a.division(a.num1, a.num2);    
  61.                       a.show(); break;    
  62.             default:cout<<a.operation<<" is not Arithmetic Operation./n";    
  63.         }    
  64.         cout<<"[BigFigure #] ";    
  65.         cin>>a;    
  66.     }    
  67.     system("cls");    
  68.     cout<<"/n/n/n/n/n/n/t/t Quited.../n/n/n/n/n/n/n";    
  69.     system("pause");    
  70. }    
  71.     
  72. string&  BigFigure::revese(string& s){    
  73.     char c;    
  74.     int t=s.size();    
  75.     for(int i=0; i<t/2; i++){    
  76.         c=s[i];    
  77.         s[i]=s[t-i-1];    
  78.         s[t-i-1]=c;    
  79.     }    
  80.     return s;    
  81. }    
  82. string& BigFigure::plus(string &str1, string &str2){//加法运算,未处理符号    
  83.     int min=0,i,t=0;    
  84.     string temp;    
  85.     outcome.clear();    
  86.     str1=revese(str1);    
  87.     str2=revese(str2);    
  88.     min=str1.size()<str2.size() ? str1.size() : str2.size();    
  89.     for(i=0; i<min; i++){    
  90.         temp+=(str1[i]+str2[i]-96+t)%10+48;    
  91.         t=(str1[i]+str2[i]-96+t)/10;    
  92.     }    
  93.     if(min==str1.size()){    
  94.         while(i<str2.size()){    
  95.             temp+=(str2[i]+t-48)%10+48;    
  96.             t=(str2[i]-48+t)/10;    
  97.             i++;    
  98.         }    
  99.         if(t) temp+='1';    
  100.     }    
  101.     else{    
  102.          while(i<str1.size()){    
  103.             temp+=(str1[i]+t-48)%10+48;    
  104.             t=(str1[i]-48+t)/10;    
  105.             i++;    
  106.         }    
  107.         if(t) temp+='1';    
  108.     }    
  109.     outcome=revese(temp);    
  110.     return outcome;    
  111. }    
  112.     
  113. string &BigFigure::subtration(string &str1, string &str2){//减法运算,未处理符号    
  114.     int min=0,flag,i,t=0;    
  115.     string temp;    
  116.     outcome.clear();    
  117.     if(str1.size()>str2.size() || (str1.size()==str2.size() && str1.compare(str2)==1)){    
  118.         str1=revese(str1);    
  119.         str2=revese(str2);    
  120.         flag=0;    
  121.         min=str2.size();    
  122.     }    
  123.     else if(str1.size()==str2.size()){    
  124.               if(!str1.compare(str2)){    
  125.                    outcome='0';    
  126.                    return outcome;    
  127.                }    
  128.                if(str1.compare(str2)==-1){    
  129.                    temp=str1;    
  130.                    str1=revese(str2);    
  131.                    str2=revese(temp);    
  132.                    flag=1;    
  133.                    min=str2.size();    
  134.                 }    
  135.     }    
  136.     else{    
  137.         temp=str1;    
  138.         str1=revese(str2);    
  139.         str2=revese(temp);    
  140.         flag=1;    
  141.         min=str2.size();    
  142.     }    
  143.     temp.clear();    
  144.     for(i=0; i<min; i++){    
  145.         if(str1[i]-t<str2[i]){    
  146.             temp+=str1[i]+10-t-str2[i]+48;    
  147.             t=1;    
  148.         }    
  149.         else{    
  150.             temp+=str1[i]-t-str2[i]+48;    
  151.             t=0;    
  152.         }    
  153.     }    
  154.     while(i<str1.size()){    
  155.         if(!t){    
  156.             while(i<str1.size()){    
  157.                 temp+=str1[i];    
  158.                 i++;    
  159.             }    
  160.             break;    
  161.         }    
  162.         if(str1[i]!='0'){ temp+=str1[i]-t; t=0; }    
  163.         else temp+='9';    
  164.         i++;    
  165.     }    
  166.     string s;    
  167.     for(unsigned int k=temp.size()-1; k>=0; k--){    
  168.         if(temp[k]!='0'){    
  169.             for(int n=k; n>=0; n--)    
  170.                 s+=temp[n];    
  171.             break;    
  172.         }    
  173.     }    
  174.     if(flag) s='-'+s;    
  175.     outcome=s;    
  176.     return outcome;    
  177. }    
  178. string& BigFigure::multiplication(string &str1, string &str2){//乘法运算,已处理符号    
  179.     char c='0',flag=0;    
  180.     string temp1,temp2="0";    
  181.     if(str1[0]=='0' || str2[0]=='0'){    
  182.         outcome="0";    
  183.         return outcome;    
  184.     }    
  185.     if(str1[0]=='-'){ flag++; str1.erase(0,1); }    
  186.     if(str2[0]=='-'){ flag++; str2.erase(0,1); }    
  187.     str1=revese(str1);    
  188.     str2=revese(str2);    
  189.     for(unsigned int i=0; i<str2.size(); i++){    
  190.         c='0';    
  191.         for(unsigned int j=0; j<str1.size(); j++){    
  192.             temp1+=((str2[i]-48)*(str1[j]-48)+c-48)%10+48;    
  193.             c=((str2[i]-48)*(str1[j]-48)+c-48)/10+48;    
  194.         }    
  195.         if(c!='0') temp1+=c;    
  196.         temp1=revese(temp1);    
  197.         for(int k=0; k<i; k++)    
  198.             temp1+='0';    
  199.         temp2=plus(temp1, temp2);    
  200.         temp1.clear();    
  201.     }    
  202.     if(flag%2) temp2='-'+temp2;    
  203.     outcome=temp2;    
  204.     return outcome;    
  205. }    
  206.     
  207. string& BigFigure::division(string &str1, string &str2){//除法运算,已处理符号    
  208.     int str=0,flag=0,flag1=0,flag2=0;    
  209.     string temp,temps,tempt;    
  210.     if(str2=="0"){    
  211.         outcome="Inf";    
  212.         return outcome;    
  213.     }    
  214.     if(str2=="1" || str1=="0"){    
  215.         outcome=str1;    
  216.         return outcome;    
  217.     }    
  218.     if(str1[0]=='-'){ flag++; str1.erase(0,1); }    
  219.     if(str2[0]=='-'){ flag++; str2.erase(0,1); }    
  220.     for(unsigned int i=0; i<str1.size(); i++){//整除处理    
  221.         str=0;    
  222.         temp+=str1[i];    
  223.         if(temp[0]=='0') temp.erase(0,1);    
  224.         if(temp.size()>str2.size() ||    
  225.               (temp.size()==str2.size() && temp.compare(str2)>=0)){    
  226.             while(temp.size()>str2.size() ||    
  227.                  (temp.size()==str2.size() && temp.compare(str2)>=0)){    
  228.                 tempt=str2;    
  229.                 temp=subtration(temp, tempt);    
  230.                 str++;    
  231.             }    
  232.             temps+=str+48;    
  233.         }    
  234.         else if(temp.size()==str2.size() && temp.compare(str2)==0) temps+='1';    
  235.         else temps+='0';    
  236.     }    
  237.     flag1=temps.size();    
  238.     if(temp!="0" && precision) temps+='.';    
  239.     for(int i=0; i<=precision && temp!="0"; i++){//小数后位的处理    
  240.         str=0;    
  241.         temp+='0';    
  242.         if(temp.size()>str2.size() ||    
  243.                (temp.size()==str2.size() && temp.compare(str2)>=0)){    
  244.             while(temp.size()>str2.size() ||    
  245.                     (temp.size()==str2.size() &&temp.compare(str2)>=0)){    
  246.                 tempt=str2;    
  247.                 temp=subtration(temp, tempt);    
  248.                 str++;    
  249.             }    
  250.             temps+=str+48;    
  251.         }    
  252.         else if(temp.size()==str2.size() && temp.compare(str2)==0) temps+='1';    
  253.         else temps+='0';    
  254.     }    
  255.     flag2=temps.size()-2;    
  256.     if(temps[temps.size()-1]>='5' && flag2-flag1==precision){//四舍五入处理    
  257.         temps.erase(flag1,1);    
  258.         temps.erase(temps.size()-1, 1);    
  259.         temp="1";    
  260.         temps=plus(temps, temp);    
  261.         if(temps.size()>flag2) temps.insert(flag1+1, 1, '.');    
  262.         else temps.insert(flag1, 1, '.');    
  263.     }    
  264.     else if(flag2-flag1==precision) temps.erase(temps.size()-1, 1);    
  265.     temp.clear();    
  266.     for(unsigned int k=0; k<temps.size(); k++){//左端去零处理    
  267.         if(temps[k]!='0' || temps[k+1]=='.'){    
  268.             for(int n=k; n<temps.size(); n++)    
  269.                 temp+=temps[n];    
  270.             break;    
  271.         }    
  272.     }    
  273.     if(flag%2) temp='-'+temp;    
  274.     outcome=temp;    
  275.     return outcome;    
  276. }    
  277. int main(){//主函数    
  278.     BigFigure a;    
  279.     a.BigFigureInterface();    
  280.     return 0;    
  281. }    
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大整数四则运算是指对于超过计算机所能表示的整数范围的数字进行加、减、乘、除等运算。在C语言中,可以通过定义结构体或数组来实现大整数的存储和运算。其中,结构体可以存储大整数的位数和每一位的值,而数组则可以将每一位的值存储在不同的元素中。下面是大整数四则运算的一些基本操作: 1.大整数的输入:可以通过将输入的字符串转换为大整数的形式来实现大整数的输入。具体实现方法可以参考引用中的代码。 2.大整数的输出:可以通过遍历大整数的每一位,将其输出来实现大整数的输出。具体实现方法可以参考引用中的代码。 3.大整数加法:可以通过模拟手算加法的过程,将两个大整数的每一位相加,并将进位的值加到下一位上来实现大整数加法。 4.大整数的减法:可以通过模拟手算减法的过程,将两个大整数的每一位相减,并将借位的值减到下一位上来实现大整数的减法。 5.大整数乘法:可以通过模拟手算乘法的过程,将两个大整数的每一位相乘,并将进位的值加到下一位上来实现大整数乘法。 6.大整数的除法:可以通过模拟手算除法的过程,将被除数的每一位和商的每一位一一对应,逐位进行除法运算,并将余数带到下一位上来实现大整数的除法。具体实现方法可以参考引用中的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值