zoukankan      html  css  js  c++  java
  • 高精计算~~~

    诶,讲什么来着???

    高精?!

    好吧,步入正题:

    高精有好多种来着,高精,高精,高精,高精

    高精除又有两种,一个是高精除低精,一个是高精除高精。

    首先是存储,因为数值极大,所以用字符串存储比较合适

    然后倒序存储,如下:

    void init(int a[]){//传入数组
        string s;
        cin>>s;//读入字符串s
        a[0]=s.lenth();//a[0]为字符串s的位数,极为重要!!!
        for(int i=1;i<=a[0];i++) {
            a[i]=s[a[0]-i]-'0';//将字符串s转为数组a,并倒序存储
        }
    }

    高精加:

    既然是加法,就需要进位!进位!进位!(重要的事情说三遍)

    进位解决的方法就是:

    c[i]=a[i]+b[i];//逐位相加c[i]为进位数
    if(c[i]>=10){//进位处理(加法中大于十进位)
        c[i]%=10;
            ++c[i+1];//上一位加十
    }

    算法描述是这样纸的:

    int c[Maxn];
    inline void add(int a[],int b[]){//a,b,c都是数组,分别存储被加数,加数以及结果
        int i=1,x=0;//x是进位的值
        while((i<=lena)||(i<=lenb)){//lena和lenb分别是a和b的数组长度
            c[i]=a[i]+b[i]+x;//第i位相加并加上上次的进位
            x=c[i]/10;//向高位进位
            c[i]%=10;//存储第i位的值
            i++//位置下标
        }
    }

    嗯嗯,就是这样纸了。

    这个其实大家都知道啦,加法就是这样,所以底下来一道例题!!!


    例题:

    洛谷P1601

    传送门

    先上代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int main()
    {
        char a1[100],b1[100];
          int a[100],b[100],c[100],lena,lenb,lenc,i,x;
          memset(a,0,sizeof(a));
          memset(b,0,sizeof(b));
          memset(c,0,sizeof(c));
          scanf("%s",a1);
          scanf("%s",b1);
          lena=strlen(a1);//输入加数与被加数
          lenb=strlen(b1);
          for (i=0;i<=lena-1;i++)
           a[lena-i]=a1[i]-48; //将加数轻轻的放入a数组
        for (i=0;i<=lenb-1;i++)
         b[lenb-i]=b1[i]-48;//将被加数扔进b数组
          lenc =1;
          x=0;
          while (lenc <=lena||lenc <=lenb)
        {
        c[lenc]=a[lenc]+b[lenc]+x;//两数相加相当于:“c[i]=a[i]+b[i];”这个
        x=c[lenc]/10;
        c[lenc]%=10;
        lenc++;
        }
        c[lenc]=x; 
        if (c[lenc]==0)
            lenc--; 
        for (i=lenc;i>=1;i--) //处理最高位
        cout<<c[i];
        cout<<endl;
        return 0;
    } 

    这题有一些地方是不全面的,

    嗯。。。

    例如说,在这一道题中并不要求要负数求值

    所以一些复杂的东东就没有了!!!

    (嘻嘻,其实少掉的东西是一个if判断啦!!!)

    这里的if判断的是数之前有无负号,这样就要相应的改变一些代码去适应一下负号,即高精减!!!

    还有就是这个代码中并没有函数,而是把函数中的东西都写到了主函数中了,这个是有迹可循的,具体的我有标注一些。

    希望对大家有用啦!!!

    高精加也就这些啦,希望大佬们给给点评!!!(如果有 新的理解我还会修改的!!!)

  • 相关阅读:
    STP配置和选路规则
    Apache(基于端口号)
    Apache(基于主机名)
    Apache(基于IP地址)
    (Apache服务)个人用户主页功能
    c语言实现通讯录,包括增加名字,删除信息,查找,修改,排序
    C语言用函数指针的数组简单实现计算器功能
    指针与数组,指针与函数之间的关系
    循环
    SQLite不支持的SQL语法总结
  • 原文地址:https://www.cnblogs.com/U58223-luogu/p/9477572.html
Copyright © 2011-2022 走看看