yr87228755 2023-07-20 11:49 采纳率: 57.1%
浏览 96
已结题

c++高精度,求思路

给你 a,b,c,使得 (a+b+2044) x d=(c x e) mod 2058$。

输出其中一种方案即可。

如果没有,输出 -1
本题包含多组数据。

给定一个 T,表示数据的组数。

接着 T 行,输入三个整数 a,b,c
T 行,每行包含两个整数 d 和 e,以一个空格隔开。

d 和 e 均不能为 0,1 或负数。
1≤T≤100,1≤a,b,c≤10^18
  • 写回答

2条回答 默认 最新

  • 爱编程的小芒果 2023-07-20 12:40
    关注

    先用高精度求出a+b+2044的值,在穷举d和e
    高精度乘法:

    struct bignum{
    int d[200];
    bignum operator*(int x){ //注意这里传入的x的范围不是int的范围,而是[0,(2^31-1)/9]。
    bignum tmp;
    for (int i=0;i<200;i++) tmp.d[i]=d[i]*x;
    for (int i=0;i<199;i++){
    tmp.d[i+1]+=tmp.d[i]/10; //从低位至高位处理进位
    tmp.d[i]%=10;
    }
    return tmp;
    }
    bignum operator*(bignum x){ //注意可以重载两次运算符*,但是*右侧的类型得不相同。
    bignum tmp;
    for (int i=0;i<200;i++) tmp.d[i]=0;
    for (int i=0;i<200;i++)
    for (int j=0;j+i<200;j++){ //注意i+j要在数组范围内
    tmp.d[i+j]+=d[i]*x.d[j];
    }
    for (int i=0;i<199;i++){
    tmp.d[i+1]+=tmp.d[i]/10; //从低位至高位处理进位
    tmp.d[i]%=10;
    }
    return tmp;
    }
    };
    

    高精度加法:

    #include<bits/stdc++.h>
    using namespace std;
    struct bignum{
    int d[200];
    void read(){
    char s[205];
    scanf("%s",s);
    int n=strlen(s);
    for (int i=0;i<n;i++) d[i]=s[n-1-i]-'0'; //读入的数和bignum的存储方式是相反的
    for (int i=n;i<200;i++) d[i]=0; //更高位要赋为0
    }
    void print(){
    int pos=199;
    while (pos>0&&!d[pos]) pos--; //找到最高位位置
    for (int i=pos;i>=0;i--) printf("%d",d[i]); puts("");
    }
    bignum operator+(bignum x){
    bignum tmp;
    for (int i=0;i<200;i++) tmp.d[i]=d[i]+x.d[i];
    for (int i=0;i<199;i++){
    if (tmp.d[i]>=10){ //发生进位
    tmp.d[i]-=10;
    tmp.d[i+1]++;
    }
    }
    return tmp;
    }
    }A,B,C;
    int main(){
    A.read();
    B.read();
    C=A+B;
    C.print();
    }
    

    高精度除法:

    struct bignum{
    int d[200];
    void init(){ //清0
    for (int i=0;i<200;i++) d[i]=0;
    }
    // 需要重载‘-’和‘<’的运算符
    bignum operator/(bignum x){
    bignum tmp,a,b;
    tmp.init();
    for (int i=0;i<200;i++) a.d[i]=d[i];
    for (int i=99;i>=0;i--){ //这里默认除数x和答案都不超过100位
    // 循环里模拟做商的过程,用减法代替除法。
    b.init();
    for (int j=0;j<100;j++) b.d[j+i]=x.d[j];
    while (!(a<b)) a=a-b,tmp.d[i]++;
    }
    return tmp;
    }
    };
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月20日
  • 修改了问题 7月20日
  • 修改了问题 7月20日
  • 修改了问题 7月20日
  • 展开全部

悬赏问题

  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!