ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

高精度计算 -- 超大数运算

2021-07-12 20:05:37  阅读:210  来源: 互联网

标签:10 高精度 -- 超大 memset MAXLEN int sizeof include


高精度运算的计算思高精度运算计算中需要处理好以下几个问题:

  1) 数据的接收方法和存储方法
  数据的接收和存储:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算
将每一位数取出,存入数组中。
  2)高精度数位数的确定
  位数的确定:接收时往往用字符串,所以它的位数就等于字符串的长度
  3)进位,错位处理
  进位,错位处理
  加法运算:
 

c[i] = a[i] + b[i]
if(c[i]>10){
c[i]%10=10;
++c[i+1];
}

减法运算: 

if(a[i]<b[i]){
--a[i+1];
a[i]+=10;
}

乘法运算:

c[i+j-1]=a[i]*b[i]+x+c[i+j-1];
x = c[i+j-1]/10;
c[i+j-1]%=10;

 

算法实现 

#  关于 高精度加法

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std ;

#define MAXLEN 110   // 确保长度 

int main(){
    char al[MAXLEN],bl[MAXLEN]; // 原始数字字符串

    // 两个加数结果 加数和结果的长度 进位
    int a[MAXLEN],b[MAXLEN],c[MAXLEN],
    lena,lenb,lenc,x;
    
    // 初始化
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));

    //输入加数和被加数
    scanf("%s%s",al,bl);

    // 计算两个字符串的长度
    lena = strlen(al);
    lenb = strlen(bl);

    //加数放入a数组
    for(int i=0;i<=lena-1;i++){
        a[lena-i]=al[i]-'0';
    }

    //加数放入b数组
    for(int i=0;i<=lenb-1;i++){
        b[lenb-i]=bl[i]-'0';
    }

    lenc = 1 ;
    x = 0 ;
    while(lenc<=lena || lenc<=lenb){  // 以两者中的最大的那个为 结束标识 
        c[lenc] = a[lenc] + b[lenc] + x ; // 两数相加
        x = (c[lenc]/10) ;  // 计算进位
        c[lenc] %= 10 ;     // 本位保留的数
        lenc++ ;
    }
    c[lenc] = x ;   // 排除非零问题 
    if(c[lenc]==0){
        lenc--; // 处理最高进位
    }

    for(int i=lenc;i>=1;i--){
        cout<<c[i] ;    // 输出结果
    }

    cout<<endl;
    return 0 ;

}
//高精度减法
#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std ;

#define MAXLEN 110 

int main(){
    int a[MAXLEN],b[MAXLEN],c[MAXLEN],lena,lenb,lenc,i;
    char n[MAXLEN],n1[MAXLEN],n2[MAXLEN]; 
    
    // 初始化
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));

    //输入减数和被减数
    scanf("%s%s",n1,n2);

    if(strlen(n1)<strlen(n2) || (strlen(n1)==strlen(n2)&&strcmp(n1,n2) < 0 )){
        strcpy(n,n1);
        strcpy(n1,n2);
        strcpy(n2,n);
        cout<<"-";  // 交换了减数和被减数,结果为负数
    }

    // 计算两个字符串的长度
    lena = strlen(n1);
    lenb = strlen(n2);

    //被减数放入a数组
    for(int i=0;i<=lena-1;i++){
        a[lena-i]=n1[i]-'0';
    }

    //减数放入b数组
    for(int i=0;i<=lenb-1;i++){
        b[lenb-i]=n2[i]-'0';
    }

    i = 1 ;
    while(i<=lena || i<=lenb){  //  什么时候结束 
       if(a[i]<b[i]){
           a[i]+=10;  // 不够减,那么向高位借1当十
           a[i+1]--;
       }
        c[i] = a[i]-b[i] ; // 对应位相减
        i++;
    }

    lenc = i ;
    while((c[lenc]==0)&&(lenc>1)){
        lenc--; //最高位的 0 不输出
    }

    for(i=lenc;i>=1;i--){
        cout<<c[i];
    }

    cout<<endl;
    return 0 ;

}

 

 

标签:10,高精度,--,超大,memset,MAXLEN,int,sizeof,include
来源: https://www.cnblogs.com/Skypeduty1225/p/15003653.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有