• c++ 高精度算法


    包括:

    两个高精度正整数加法
    两个高精度正整数乘法
    两个高精度正整数减法
    两个高精度正整数除法
    两个高精度正整数求余
    两个高精度正整数数求最大公约数
    两个高精度正整数数求最小公倍数 

      1 #include <iostream>  
      2 #include <string>
      3 
      4 using namespace std;
      5 
      6 //清除前缀0,如果结果是空字符串则设为0 
      7 inline void clear(string& a){
      8     while(a.length()>0 && a[0]=='0')
      9         a.erase(0, 1);
     10     if(a == "")
     11         a = "0";
     12 }
     13 
     14 //如果a>=b则返回真(如果包含前缀零会被消除) 
     15 bool isBigger(string a, string b){
     16     clear(a);
     17     clear(b);
     18     if(a.length() > b.length())
     19         return true;
     20     if(a.length()==b.length() && a>=b)
     21         return true;
     22     return false; 
     23 }
     24 
     25 
     26 //两个高精度正整数加法 a+b 
     27 string stringAddString(string a, string b){
     28     //1、对位,将两个数补零直到其具有相同长度 
     29     while(a.length() < b.length())         
     30         a = '0' + a;
     31     while(a.length() > b.length())
     32         b = '0' + b; 
     33     //2、补零,在开头再加一个0以便进位
     34     a = '0' + a;
     35     b = '0' + b;
     36     //3、从低位开始相加,注意进位
     37     for(int i=a.length()-1; i>=0; i--){
     38         a[i] = a[i] + b[i] - '0';
     39         if(a[i] > '9'){
     40             a[i] = a[i] - 10;
     41             a[i-1] += 1;
     42         }
     43     } 
     44     clear(a);
     45     return a;  
     46 }
     47 
     48 //两个高精度正整数减法 a-b 
     49 string stringSubString(string a, string b){
     50     bool aBigger = true;
     51     //1、对位,将两个数补零直到其具有相同长度 
     52     while(a.length() < b.length())         
     53         a = '0' + a;
     54     while(a.length() > b.length())
     55         b = '0' + b;  
     56     //2、推测结果正负值,调整为前大后小 
     57     if(a < b)  
     58     {  
     59         aBigger = false;  
     60         string buf = b;  
     61         b = a;  
     62         a = buf;  
     63     } 
     64     //3、从低位开始相减,注意借位
     65     for(int i=a.length()-1; i>=0; i--){
     66         if(a[i] >= b[i]){
     67             a[i] = a[i] - (b[i] - '0');
     68         }else{
     69             a[i] = a[i] + 10;
     70             a[i-1] -= 1;
     71             a[i] = a[i] - (b[i] - '0');
     72         }
     73     }
     74     clear(a);
     75     if(!aBigger)   
     76         a = '-' + a;
     77     return a;    
     78 }
     79 
     80 //两个高精度正整数乘法 a*b
     81 //依赖加法 
     82 string stringMultString(string a, string b){
     83     string result = "0";
     84     if(a.length() < b.length()){
     85         string buf = a;
     86         a = b;
     87         b = buf;
     88     } 
     89     //多位数乘一位数可以直接使用加法
     90     //多位数乘以形如d*10^n的数可以转化为多位数乘以一位数 
     91     //多位数乘以多位数可以转化为若干个多位数乘以一位数相加
     92     for(int i=b.length()-1; i>=0; i--){
     93         for(int j=0; j<b[i]-'0'; j++){
     94             result = stringAddString(result, a);
     95         }
     96         a = a + '0';
     97     }
     98     clear(result);
     99     return result; 
    100 }
    101 
    102 //两个高精度正整数除法 a/b 
    103 //依赖减法 
    104 string stringDivString(string a, string b){
    105     clear(a);
    106     clear(b);
    107     if(b == "0")
    108         return "Error!";
    109         
    110     string result = "";
    111     string remainder = "";
    112     //从高位开始除,和手算除法一样 
    113     // 一旦取位刚好大于被除数则开始用减法求商 
    114     for(int i=0; i<a.length(); i++){
    115         remainder = remainder + a[i];
    116         result = result + '0';
    117         while(isBigger(remainder, b)){
    118             result[result.length()-1]++;
    119             remainder = stringSubString(remainder, b);
    120         }
    121     }
    122     clear(result);
    123     return result;
    124 }
    125 
    126 //两个高精度正整数求余 a%b
    127 //依赖减法 
    128 string stringModString(string a, string b){
    129     clear(a);
    130     clear(b);
    131     if(b == "0")
    132         return "Error!";   
    133            
    134     string result = "";
    135     string remainder = "";
    136     //和除法唯一的区别就是返回值不一样 
    137     for(int i=0; i<a.length(); i++){
    138         remainder = remainder + a[i];
    139         result = result + '0';
    140         while(isBigger(remainder, b)){
    141             result[result.length()-1]++;
    142             remainder = stringSubString(remainder, b);
    143         }
    144     }
    145     clear(remainder);
    146     return remainder;
    147 } 
    148       
    149 //两个高精度数求最大公约数 gcd(a,b)
    150 //依赖求余 
    151 string stringGcd(string a, string b){
    152     clear(a);
    153     clear(b);
    154     if(!isBigger(a, b)){
    155         string buf = a;
    156         a = b;
    157         b = buf;
    158     }
    159     //使用辗转相除法求最大公约数
    160     if(b == "0"){
    161         return a;
    162     }else{
    163         return stringGcd(b, stringModString(a, b)); 
    164     }
    165 }
    166  
    167 //两个高精度数求最小公倍数 lcm(a,b)
    168 //依赖乘法
    169 //依赖除法
    170 //依赖最大公约数 
    171 string stringLcm(string a, string b){
    172     clear(a);
    173     clear(b);
    174     string buf = stringMultString(a, b);
    175     //使用公式 lcm(a,b)=a*b/gcd(a,b) 
    176     if(buf == "0"){
    177         return "0";
    178     }else{
    179         return stringDivString(buf, stringGcd(a, b)); 
    180     }
    181 }
    182 
    183 int main()
    184 {    
    185     string choose; 
    186     string a, b;
    187     while (1){
    188         cout << "请输入两个正整数:";
    189         cin >> a >> b;
    190         cout << "a  +  b   = " << stringAddString(a, b) << endl
    191              << "a  -  b   = " << stringSubString(a, b) << endl
    192              << "a  *  b   = " << stringMultString(a, b) << endl
    193              << "a  /  b   = " << stringDivString(a, b) << endl
    194              << "a  %  b   = " << stringModString(a, b) << endl
    195              << "gcd(a, b) = " << stringGcd(a, b) << endl
    196              << "lcm(a, b) = " << stringLcm(a, b) << endl;
    197         cout << "输入"q"退出,人以其他字符继续:";
    198         cin >> choose;
    199         if(choose == "q")
    200             break;
    201     } 
    202     return 0;
    203 }
  • 相关阅读:
    通过PDB文件实现非嵌入式的c++反射
    在c++中实现反射的初步想法
    对比特币相关的一些技术细节的补充
    初窥比特币
    根据一个坐标查找其所属区域的一些优化想法
    go两种数据类型的区别、数据类型和操作符、常量、变量声明
    go的相关包time、os、rand、fmt
    go语言的特性
    结构体
    defer、panic、recover
  • 原文地址:https://www.cnblogs.com/tanjiaqi/p/7545520.html
Copyright © 2020-2023  润新知