zoukankan      html  css  js  c++  java
  • 高精度算法(一)

    高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。--------百度百科

    输入时用字符串存储,转化为int类型数组,一个元素对应一位,也可以几位。本次测试均为一位。存储时按照高位对应下标小的位置,用下标为0的元素存储此数的位数。如6789存到int数组为a[0]=4(总共有4位),a[1]=6,a[2]=7,a[3]=8,a[4]=9;运算时先从1到(a[0]+1)/2元素对换即可。

    为了减法运算添加比较函数Compare(),并且将返回值设置为int类型,具体见代码

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 using namespace std;
      5 const int N=200;
      6 char s[N];
      7 void input(int a[]) { //输入函数
      8     gets(s);
      9     a[0]=strlen(s);
     10     for(int i=1; i<=a[0]; i++) {
     11         a[i]=s[i-1]-'0';
     12     }
     13 }
     14 
     15 void output(int a[]) { //输出函数
     16     for(int i=1; i<=a[0]; i++) {
     17         printf("%d",a[i]);
     18     }
     19     putchar('
    ');
     20 }
     21 
     22 int Compare(int a[],int b[]) { //比较函数    返回值定为int类型可以用在Dec函数中
     23     if(a[0]>b[0])
     24         return 1;
     25     else if(a[0]<b[0])
     26         return -1;
     27     else {
     28         for(int i=1; i<=a[0]; i++) {
     29             if(a[i]>b[i]) {
     30                 return 1;
     31             } else if(a[i]<b[i]) {
     32                 return -1;
     33             }
     34         }
     35         return 0;
     36     }
     37 
     38 }
     39 
     40 void Plus(int a[],int b[]) { //加法函数 a=a+b
     41     for(int i=1; i<=(a[0]+1)/2; i++) {
     42         int tmp=a[a[0]-i+1];
     43         a[a[0]-i+1]=a[i];
     44         a[i]=tmp;
     45     }
     46     for(int i=1; i<=(b[0]+1)/2; i++) {
     47         int tmp=b[b[0]-i+1];
     48         b[b[0]-i+1]=b[i];
     49         b[i]=tmp;
     50     }
     51     int l=(a[0]>b[0]?a[0]:b[0]);
     52     for(int i=1; i<=l; i++) {
     53         a[i+1]+=(a[i]+b[i])/10;
     54         a[i]=(a[i]+b[i])%10;
     55     }
     56     if(a[l+1])
     57         a[0]=l+1;
     58     else
     59         a[0]=l;
     60     for(int i=1; i<=(a[0]+1)/2; i++) {
     61         int tmp=a[a[0]-i+1];
     62         a[a[0]-i+1]=a[i];
     63         a[i]=tmp;
     64     }
     65     for(int i=1; i<=(b[0]+1)/2; i++) {
     66         int tmp=b[b[0]-i+1];
     67         b[b[0]-i+1]=b[i];
     68         b[i]=tmp;
     69     }
     70 }
     71 
     72 void Dec(int a[],int b[]) { //减法函数 a=a-b
     73 
     74     int flg=Compare(a,b);
     75     for(int i=1; i<=(a[0]+1)/2; i++) {
     76         int tmp=a[a[0]-i+1];
     77         a[a[0]-i+1]=a[i];
     78         a[i]=tmp;
     79     }
     80     for(int i=1; i<=(b[0]+1)/2; i++) {
     81         int tmp=b[b[0]-i+1];
     82         b[b[0]-i+1]=b[i];
     83         b[i]=tmp;
     84     }
     85     if(flg==1) {
     86         for(int i=1; i<=a[0]; i++) {
     87             if(a[i]<b[i]) {
     88                 a[i+1]--;
     89                 a[i]+=10;
     90             }
     91             a[i]=a[i]-b[i];
     92         }
     93         while(a[a[0]]==0)
     94             a[0]--;
     95     }
     96     if(flg==0) {
     97         a[0]=1;
     98         a[1]=0;
     99         return;
    100     }
    101     if(flg==-1) {
    102         for(int i=1; i<=b[0]; i++) {
    103             if(a[i]>b[i]) {
    104                 b[i+1]--;
    105                 b[i]+=10;
    106             }
    107             a[i]=b[i]-a[i];
    108         }
    109         a[0]=b[0];
    110         while(a[a[0]]==0)
    111             a[0]--;
    112     }
    113 
    114     for(int i=1; i<=(a[0]+1)/2; i++) {
    115         int tmp=a[a[0]-i+1];
    116         a[a[0]-i+1]=a[i];
    117         a[i]=tmp;
    118     }
    119     for(int i=1; i<=(b[0]+1)/2; i++) {
    120         int tmp=b[b[0]-i+1];
    121         b[b[0]-i+1]=b[i];
    122         b[i]=tmp;
    123     }
    124 }
    125 
    126 void Mul(int a[],int b[],int c[]){ //乘法函数  a=a*b
    127      for(int i=1; i<=(a[0]+1)/2; i++) {
    128         int tmp=a[a[0]-i+1];
    129         a[a[0]-i+1]=a[i];
    130         a[i]=tmp;
    131     }
    132     for(int i=1; i<=(b[0]+1)/2; i++) {
    133         int tmp=b[b[0]-i+1];
    134         b[b[0]-i+1]=b[i];
    135         b[i]=tmp;
    136     }
    137     int l;
    138     for(int i=1; i<=a[0]; i++) {
    139         for(int j=1,l=i-1;j<=b[0];j++){
    140             c[++l]+=(a[i]*b[j]);
    141         }
    142     }
    143     for(int i=1;i<=l;i++){
    144         if(c[i]>9){
    145             l++;
    146             c[i+1]+=c[i]/10;
    147             c[i]=c[i]%10;
    148         }
    149         a[i]=c[i];
    150     }
    151     while(a[l]==0) l--;
    152     a[0]=l;
    153 
    154 
    155 
    156     for(int i=1; i<=(a[0]+1)/2; i++) {
    157         int tmp=a[a[0]-i+1];
    158         a[a[0]-i+1]=a[i];
    159         a[i]=tmp;
    160     }
    161     for(int i=1; i<=(b[0]+1)/2; i++) {
    162         int tmp=b[b[0]-i+1];
    163         b[b[0]-i+1]=b[i];
    164         b[i]=tmp;
    165     }
    166 }
    167 
    168 int main() {
    169 
    170     int a[N]= {0},b[N]= {0},c[N]={0};
    171     freopen("C:\CODE\in.txt", "r", stdin);
    172 //    freopen("C:\CODE\out.txt","w",stdout);
    173     //测试compare函数
    174     for(int i=0; i<3; i++) {
    175         input(a);
    176         input(b);
    177         //    printf("a = ");
    178         //    output(a);
    179         //    printf("b = ");
    180         //    output(b);
    181         if(Compare(a,b)==1)
    182             printf("a>b
    ");
    183         else if(Compare(a,b)==-1)
    184             printf("a<b
    ");
    185         else
    186             printf("a=b
    ");
    187     }
    188 
    189     //测试Plus函数
    190     input(a);
    191     input(b);
    192     Plus(a,b);//a=a+b;
    193     printf("a = ");
    194     output(a);
    195 
    196     //测试Dec函数
    197     for(int i=0; i<3; i++) {
    198         input(a);
    199         input(b);
    200         Dec(a,b);//a=a-b;
    201         printf("a = ");
    202         output(a);
    203 
    204     }
    205 
    206     //测试Mul函数
    207     input(a);
    208     input(b);
    209     Mul(a,b,c);//a=a*b;
    210     printf("a = ");
    211     output(a);
    212 
    213 
    214 
    215     return 0;
    216 }

    附上自己的测试数据

    1244
    12345
    12345
    1234
    0
    0
    123456789
    123456789
    223456789987654321
    9987654321
    123456789
    123456789
    223456789987654321
    2223456789987654321
    999
    100
    ---------------- 人们生成的最美好的岁月其实就是最痛苦的时候,只是事后回忆起来的时候才那么幸福。
  • 相关阅读:
    vue-自定义指令
    vue-自定义过滤器--时间
    vue-jsonp
    vue-post
    vue-get-参数
    vue-get
    vue-百度下拉列表
    C#网页授权获取微信Openid
    C#微信环境分享页面给微信好友、朋友圈
    IIS服务器同时使用多个https证书如何操作443端口
  • 原文地址:https://www.cnblogs.com/livelihao/p/5161704.html
Copyright © 2011-2022 走看看