高精50分,Dalao们有没有知道怎么办的

P1001 A+B Problem

Poombom @ 2023-07-01 08:58:27

本来是写完P1303回来逝逝的,结果50分...... 在P1303都AC了 代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000001]={},b[1000001]={},c[1000001]={},i,f;
char d[1000001],e[1000001];
bool x=false;
int main( )
{
    cin>>d>>e;
    a[0]=strlen(d);
    b[0]=strlen(e);
    for(i=1;i<=a[0];i++)a[i]=d[a[0]-i]-'0';
    for(i=1;i<=b[0];i++)b[i]=e[b[0]-i]-'0';
    f=max(a[0],b[0]);
    for(i=1;i<f+1;i++)
    {
        c[i]=a[i]+b[i];
        if(c[i]>=10){c[i]%=10;b[i+1]++;}
    }
    c[i]=b[i];
    if(c[i] != 0)cout<<c[i];
    c[0]=i;
    for(int i=c[0]-1; i>=1; i--) {
        cout<<c[i];
    }
    return 0;
}

敲了有一个小时才敲出来的 可能我还是太菜了


by Weizhuo_Zhao @ 2023-07-01 09:39:44

@cq_zry 不对,我好想迷糊了...


by cq_zry @ 2023-07-01 09:42:13

@Weizhuo_Zhao 你指的高精是 long long


by Weizhuo_Zhao @ 2023-07-01 09:43:23

@cq_zry 不细,我迷了


by lorry26 @ 2023-07-01 09:55:34

a+b?


by lorry26 @ 2023-07-01 10:02:07

高精码:

#include<bits/stdc++.h>
using namespace std;
int a[1000001],b[1000001],c[1000001],j;
bool x=false;
char s[1000001],s2[1000001];
int main() {

    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    scanf("%s%s",s,s2);
    a[0]=strlen(s);
    b[0]=strlen(s2);
    for(int i=1; i<=a[0]; i++) a[i]=s[a[0]-i]-'0';
    for(int i=1; i<=b[0]; i++) b[i]=s2[b[0]-i]-'0';
    for(j=1; j<=max(a[0],b[0])+1; j++) {
        c[j]=a[j]+b[j];
        if(c[j]>=10) {
            c[j]%=10;
            a[j+1]++;
        }
    }
    c[0]=j;
    if(c[j+1]>0) c[0]++;
    for(int i=c[0]; i>=1; i--)
    {
        if(x==false&&c[i]==0) continue;
        x=true;
        cout<<c[i];
    }
    if(x==false) cout<<0;
    printf("\n");
    return 0;
}

低精码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
cout<<a+b;
return 0;
}

by steelseries @ 2023-07-02 21:23:22

SO,高精度有用吗


by chensicheng0402 @ 2023-07-03 18:25:42

这题根本不需要用高精


by CznTree @ 2023-07-04 08:30:39

@kristopher 当然有用了 你这什么问题啊。

当数爆 long long 时就需要高精度

oi里还是经常遇见的,模板也经常考


by mc_lhz @ 2023-07-08 16:03:35

@chensicheng0402 要


by White_Falcon @ 2023-07-14 15:11:44

  1. 两个高精度数的加法:倒序补 0,对应位相加,处理进位,倒序输出。 第一步:定义两个字符型数组 a1,b1 用来存储进行相加的两个高精度数,定义整型数组 a,b,c 分别用来存储两个高精度数的数字和相加后得到的数字,定义整型变量 lena,lenb, i 分别表示相加的两个数的位数及循环变量,定义整型变量 lenc,x 分别表示两个高精度数 相加后的数的位数长度和进位,对 lenc 和 x 赋初始值为 0; char a1[1001]= {},b1[1001]= {}; int a[1001]= {},b[1001]= {},c[1001]= {},lena,lenb,i; int lenc = 0,x = 0; 第二步:输入两个高精度数,并分别求出两个高精度数的长度; 第三步:使用 for 循环遍历,分别将存储在字符数组里的被加数和加数字符串转换为数字, 并倒序储存到整型数组里; 第四步:使用 while 循环语句对各个数位上的数求和,满足相加得到的位数小于 a 的长度 或者 b 的长度时,执行循环语句,每次循环的过程中将 a 和 b 对应位的数相加并加上进位 x 的值,得到对应数位的数存储在 c 数组中,因为得到的数可能超过 10,因此计算完后需要进 行进位 x 值的更新,并用该数对 10 取余得到该位上的数; 第五步:使用 if 语句判断三个高精度最高位相加的进位 x 是否不为 0,成立则赋值给相 加和的最高位,不成立则 lenc 减 1,去掉前导 0; 第六步:使用 for 循环语句进行倒序输出各个数位上的数即为最后的正确结果。 cin>>a1>>b1; lena = strlen(a1); lenb = strlen(b1); for(i = 0; i <= lena-1; i++) { a[lena-i-1] = a1[i] - 48; } for(i = 0; i <= lenb -1; i++) { b[lenb-i-1] = b1[i] - 48; } while(lenc<lena||lenc<lenb) { c[lenc]=a[lenc]+b[lenc]+x; x = c[lenc]/10; c[lenc] = c[lenc]%10; lenc++; } if(x){ c[lenc]=x; }else{ lenc--; } for( i = lenc; i >= 0; i--){ cout << c[i]; }

上一页 | 下一页