zoukankan      html  css  js  c++  java
  • 整数高精度运算——加法

    高精度运算是信息学的一种重要算法。这种算法使用多个存储单位进行计算,因此它的计算范围超过一般使用一个存储单位的算法。也是一些信息学竞赛的常考题目。

    高精度运算主要有以下几个步骤:

    1、读取字符串,转换成数字倒序存储到整数数组中;

    2、运算,注意进位和借位;

    3、倒序输出整数数组,加法注意最高位进位,减法注意高位中的无用的0不要输出;

    高精度加法代码:

    #include<stdio.h>
    #include<string.h>
    char s[1000];       //数组比较大时,应作为全局变量来定义
    int a[1000]={0},b[1000]={0};
    int main()
    {
    int l1,l2,l,i;
    scanf("%s",s);    //读第一个整数
    l1=strlen(s);      //求整数(字符串)的长度
    for(i=0;i<=l1-1;i++)   //将整数倒序存储到整数数组a中
    {
    a[l1-1-i]=s[i]-'0';  //s[i]是字符类型,通过减去0的ASCII码得到整数类型,如:将字符1转成数字1
    }
    scanf("%s",s);    //读第二个整数
    l2=strlen(s);
    for(i=0;i<=l2-1;i++)
    {
    b[l2-1-i]=s[i]-'0';
    }
    if(l1>l2)
    l=l1;
    else
    l=l2;
    for(i=0;i<=l-1;i++)    //加法运算
    {
    a[i]=a[i]+b[i];
    if(a[i]>=10)    //大于10的往高位进一位
    {
    a[i+1]=a[i+1]+1;
    a[i]=a[i]-10;
    }
    }
    if(a[l]!=0)    //判断最高位是否有进位
    l++;
    for(i=l-1;i>=0;i--)   //输出
    printf("%d",a[i]);
    }

    高精度减法代码:

    #include<stdio.h>
    #include<string.h>
    char s[1000];
    int a[1000]={0},b[1000]={0},c[1000]={0};
    int main()
    {
    int i,j,z,l1,l2,l,o;
    freopen("hp-.in","r",stdin);
    freopen("hp-.out","w",stdout);
    scanf("%s",s); //a
    l1=strlen(s);
    for(i=0;i<=l1-1;i++) //把s(被减数)转换成数字,并倒序存入a数组
    a[l1-1-i]=s[i]-'0';
    scanf("%s",s);
    l2=strlen(s);
    for(i=0;i<=l2-1;i++) //把s(减数)转换成数字,并倒序存入b数组
    b[l2-1-i]=s[i]-'0';

    if(l1==l2){
    for(j=l1;j>=0;j--)
    {
    if(a[j]>b[j]) //a大
    {
    o=0;
    break;
    }
    if(b[j]>a[j]) //b大
    {
    o=1;
    break;
    }
    }
    }
    if(l1>l2||o==0) //a大时 ,a-b
    {
    l=l1;
    for(i=0;i<l;i++)
    {
    if(a[i]<b[i])
    {
    a[i]=a[i]+10;
    a[i+1]=a[i+1]-1;
    }
    c[i]=a[i]-b[i];
    }
    while(l>1&&c[l-1]==0) l--; //舍去高位中无用的0
    for(i=l-1;i>=0;i--) //输出
    {
    printf("%d",c[i]);
    }
    }
    else
    {
    printf("-");
    l=l2;
    for(i=0;i<l;i++)
    {
    if(a[i]>b[i])
    {
    b[i]=b[i]+10;
    b[i+1]-=1;
    }
    c[i]=b[i]-a[i];
    }
    while(l>1&&c[l-1]==0) l--; //舍去高位中无用的0
    for(i=l-1;i>=0;i--) //输出
    {
    printf("%d",c[i]);
    }
    }

    return 0;
    }

  • 相关阅读:
    【26】多任务学习
    【25】迁移学习
    【24】定位数据不匹配
    【23】不匹配数据划分的偏差和方差;判断问题所在的几个重要参数
    【22】在不同的划分上进行训练和测试
    【21】进行误差分析
    17-----vue-cli脚手架安装和webpack-simple模板项目生成
    15-----修饰符
    14-----表单输入绑定
    12-----指令系统介绍
  • 原文地址:https://www.cnblogs.com/qingjianswu/p/5647874.html
Copyright © 2011-2022 走看看