在 C++ 中乘以大数 - 有错误的代码?如何改进它? [关闭]

Posted

技术标签:

【中文标题】在 C++ 中乘以大数 - 有错误的代码?如何改进它? [关闭]【英文标题】:Multiplying big numbers in C++ - code with mistakes? How to improve it? [closed] 【发布时间】:2017-12-04 20:39:03 【问题描述】:

我们得到了一个任务,要编写一个乘以大数的函数,它将结果打印在屏幕上。

到目前为止,这是我的代码:

void mnozenie(string a, string b)

    if(a=="0"||b=="0")
        cout<<0;
  else 
  

    bool minus=false;

    if((a[0]=='-'&&b[0]!='-')||(b[0]=='-'&&a[0]!='-'))
        minus=true;

    if(a[0]=='-')
        a.erase(a.begin());

    if(b[0]=='-')
        b.erase(b.begin());    

    if(a.size()<b.size())
        swap(a,b);

    vector<int> C;
    for(int i=0; i<(int)a.size()+(int)b.size(); i++)
        C.push_back(0);

    for(int i=(int)b.size()-1; i>=0; i--)
    
        for(int j=(int)a.size()-1; j>=0; j--)
        
            C[i+j+1]+=((a[j]-'0')*(b[i]-'0'));
            int k=i+j+1;
            while(C[k]>9&&k>0)
            
               C[k-1]+=C[k]/10;
               C[k]=C[k]%10;
               k--; 
            

        



    

    while(C[0]==0)
        C.erase(C.begin());

    if(minus)
        cout<<"-";

    for(int i=0; i<(int)C.size(); i++)
        cout<<C[i];

    cout<<endl;
        




我没有找到不正确的案例,但是当我尝试提交时,我收到了 ANSWER 错误。所以大概有这样的情况。

【问题讨论】:

你得到什么结果?你期待什么结果? 请更好地格式化您的代码,以便我们阅读。示例:int k = i + j + 1; 输入是什么?输出是什么?你期望什么输出?你的调试器告诉你什么? 但我看不出我的错误在哪里 - 在这段代码上花了很长时间。 -- 我讨厌这样说,但永远不应该这样说如果是你自己编写代码的一个选项。每次编写程序时,您必须确定每一行、循环、变量声明、赋值,应该做什么。如果您随后运行您的程序,但它的行为不符合预期,您应该确切地知道要查找什么以查看问题所在。 现在它几乎是正确的 - 当它给出不正确的结果时我找不到任何情况但是当我提交我的代码时我得到 ANSWER 错误。 【参考方案1】:

不确定这是唯一的问题,但确实是个问题......

当你写作时

  if ( a[0] = '-')
     a.erase(a.begin());

  if ( b[0] = '-')
     b.erase(b.begin());  

您,在测试中,分配 '-'a[0]b[0]

我想您的意图是测试 a[0] 是否为 '-'(与 b[0] 相同

所以我建议修改

  // .......vv
  if ( a[0] == '-')
     a.erase(a.begin());

  // .......vv
  if ( b[0] == '-')
     b.erase(b.begin());   

【讨论】:

非常感谢!天啊,我还是犯了这么愚蠢的错误。 //更新不幸的是它仍然产生不正确的结果:(但它比以前更好了 @Natalia - 附加建议:激活编译器配置选项以获取 all 警告并将所有警告视为错误。编译器通常将诸如分配/测试之类的问题作为警告发出信号。恕我直言,好的代码必须没有错误。

以上是关于在 C++ 中乘以大数 - 有错误的代码?如何改进它? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eigen (C++) 中处理复数?

在 C++ 中使用二维向量乘以矩阵

排序函数在 C++ 算法中是如何工作的,以及如何改进这段代码? [关闭]

如何在 C++ 中将大数字符串转换为整数?

剑指 Offer 43. 1~n 整数中 1 出现的次数(为什么是大数这边数的个数乘以小数边数的个数)

在哪里定义 C++ 中的错误代码常量