高精计算~~~

Posted u58223-luogu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精计算~~~相关的知识,希望对你有一定的参考价值。

诶,讲什么来着???

高精?!

好吧,步入正题:

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

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

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

然后倒序存储,如下:

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判断的是数之前有无负号,这样就要相应的改变一些代码去适应一下负号,即高精减!!!

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

希望对大家有用啦!!!

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

以上是关于高精计算~~~的主要内容,如果未能解决你的问题,请参考以下文章

JAVA计算时实现数字计算结果高精度

高精度问题,C语言,求二的n次方

求助 c语言实现高精度乘法

火星坐标(GCJ02)高精度反算

高精计算~~~

高精度计算