由洛谷中的一个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去把