关于自己c++和java遇到的一些高精度计算问题

由洛谷中的一个A+B problem 和 A*B problem 我好像又悟出了一点点东西!

比如用c++写这个问题 就十分复杂
要根据我们平时运算考虑到每一次的进位问题,还有加完之后考虑的进位问题。这些东西假如你在循环的时候少计算了一位你的结果数组或者多计算了你的结果数组就会出现错误

例如 你少考虑的一位你的结果数组
就像 99*99
你少考虑一位很明显 十位乘起来会把进位给丢掉导致精度丢失

那又有人说了 我开大一点 进位的时候应该会没事把?

兄弟你问道关键了 。就是你多考虑一位
比如我进位代码是这样的

如下:

for(int i=1;i<len;++i){
if(c[i]>9){
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
}

我相信大家进位的细节应该知道 这里不多讲 洛谷题解里面也有很详细的大佬讲。
但是在这里 我想说的是 ,你多计算一位。意思是循环本来是从i到len-1。 这里你开大点就从i到len 你多了一位,那根据进位法则,你如果进的一位小于10 这里就假如你进的那一位是8
意思就是c【i+1】=8(加到了最后一位) 这个时候大家都加到了最后一位,最后一位就是8 但是你开多了一位 那根据c【i+1】+=c【i】/10,根据int的取整特性 你的c【i+1】就是0
导致精度丢失
这里如果我讲的不清楚可以看我的完整代码自己试试
这是一A+B problem的代码。

#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
char a1[100005],b1[100005];
int a[100001],b[100001],len,c[100001];
int main(){
cin>>a1>>b1;
a[0]=strlen(a1);b[0]=strlen(b1);
len=max(a[0],b[0]);
for(int i=1;i<=a[0];++i)a[i]=a1[a[0]-i]-'0';
for(int i=1;i<=b[0];++i)b[i]=b1[b[0]-i]-'0';
for(int i=1;i<=len;++i){
c[i]=a[i]+b[i];}
for(int i=1;i<len;++i){//这里大家可以把i<len  改成i<=len试试你多加一位的情况 很明显精度丢失 
if(c[i]>9){
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
}
while(len>1&&c[len]==0)len--;
for(int i=len;i>=1;i--)cout<<c[i];
 
return 0;

}

好了讲完废话 我想说一下java牛逼的地方
不愧是java 直接有了个BigInteger类
而这题 你完全两行解决
`。

Scanner sc=new Scanner(System.in);
        System.out.print(sc.nextBigInteger().add(sc.nextBigInteger()));
下面还有 例如java做阶乘之和
题目地址[阶乘之和](https://www.luogu.com.cn/problem/P1009)
这些  BigInteger方法需要记住

方法	描述
public BigInteger (String var)	将一个字符串变为BigInteger类型的数据
public BigInteger add(BigInteger val)	加法
public BigInteger subtract(BigInteger val)	减法
public BigInteger multiply(BigInteger val)	乘法
public BigInteger subtract(BigInteger val)	除法


下面是ac代码
public class Main{
    public static void main(String[] args) {
        BigInteger num=new BigInteger("1");
        BigInteger flat=new BigInteger("1");
        BigInteger all=new BigInteger("0");
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        for(int j=1;j<=n;j++){
        for (int i = 1; i <= j; i++) {
            flat=flat.multiply(num);
            num=num.add(new BigInteger("1"));
        }
        all=all.add(flat);
        num=new BigInteger("1");
        flat=new BigInteger("1");
        }
        System.out.println(all);
      
     
    }
}
好了我专心学java去把 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值