• 高精度加(减)法


    Dev.C++高精度加法:因为有亿点点数据较大的计算用long long int无法存储,所以这里引入了高精度的概念。

    先贴代码:


    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a[1000],b[1000],c[1000],l1,l2,l;
    char x[1000],y[1000]; 
    int main(){
    	gets(x);
    	gets(y);
    	l1=strlen(x);
    	for(int i=1;i<=l1;i++)a[i]=x[l1-i]-48;
    	l2=strlen(y);
    	for(int i=1;i<=l2;i++)b[i]=y[l2-i]-48;
    	l=max(l1,l2);
    	for(int i=1;i<=l;i++){
    		n=a[i]+b[i]+m;
    		m=c[i]/10;
    		c[i]=n%10;
    		m=m+n;
    		if(m<10)m=0;	
    		else{
    			m=1;
    			c[i+1]++;
    		}
    	}
    	if(m)l++;
    	for(int i=l;i>=1;i--)cout<<c[i];
    }
    

    意义:因为有亿点点数据较大的计算用long long int无法存储,所以这里引入了高精度的概念。
    使用:既然用整形装不下,那就用数组!因为字符数组输入时是一个字符一个字符的输入,所以用字符数组输入。
    运算部分用整形数组还是字符数组都无所谓了,只不过字符数组要调整的地方可能比较多,
    所以这里转换成整形数组-- -- -- -- -- -- -- -- -- -- -- -- --

    for(int i=1;i<=l1;i++)a[i]=x[l1-i]-48;
    for(int i=1;i<=l2;i++)b[i]=y[l2-i]-48;
    

    -- -- -- -- --与此同时获取他们的数位-- -- -- -- -- -- -- -- -- -

    l1=strlen(x);
    l2=strlen(y);
    l=max(l1,l2);
    

    接下来是重点的计算部分(顺着代码讲,贴!)   

            for(int i=1;i<=l;i++){
    		n=a[i]+b[i]+m;
    		m=c[i]/10;
    		c[i]=n%10;
    		m=m+n;
    		if(m<10)m=0;	
    		else{
    			m=1;
    			c[i+1]++;
    		}
    	}
    	if(m)l++;
    

    • n:暂时性储存并计算第i位
    • m:暂时清0
    • c[i]:将n的数值存入输出数组中
    • n%10{
      假设n<10
      此时n÷10=0,余数是它本身。把它赋进去就ok
      当n≥10时
      n÷10=1,余数是它本身减去10.
      所以把n%10赋进去就ok
      }
    • m:测试进位问题{
      当m<10时,这一位莫得进位,可以安心算下一位了
      当m≥10时,这一位有进位,要进行整理。首先,将下一位加一个一(这是因为当它是最后一位时,最后一位进位了,
      但是l不到那里,所以循环已经结束了,不会进行进位运算。平常的情况,c数组等于一时,后来回直接变成n而不是加等于,所以这一点不用担心),
      然后,将m+1(下一次运算中会将m算入进位计算中,还能起到标记作用)就ok了.
      }
    • if(m)l++:在m≠0时,他是要进位的。但是如果到了最后一位,因为l是固定的,所以要进行数组扩容,将进位的地方也输出出来
      倒序输出:我们是正序计算的(也可以倒序计算,那么输入输出就是正序的),因为计算是从小位算到大位,而输入输出是从大位开始的,
      所以两者顺序要反
      一下。
      —————————————————————————————————————————————————————————————————————

    结论: 其实高精度加法挺简单的 减法和加法思路是一样的,只不过借位与进位处理有些不同罢了。高精度的计算可以当成一个模板打在函数里(在数据大的时候),

    所以最好背下来哦!

  • 相关阅读:
    Jenkins系列之二——centos 6.9 + JenKins 安装
    查看linux系统是运行在物理机还是虚拟机方法
    Java 的不可变类 (IMMUTABLE CLASS) 和 可变类 (MUTABLE CLASS)
    Java中的mutable和immutable对象实例讲解
    理解Java中的引用传递和值传递
    深入理解Java中的Clone与深拷贝和浅拷贝
    java Clone使用方法详解
    Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
    赏美-第[001]期-20190504
    赏美-第[000]期
  • 原文地址:https://www.cnblogs.com/riced/p/13393466.html
Copyright © 2020-2023  润新知