【问题标题】:How can I multiply really big numbers c++我怎样才能乘以非常大的数字c ++
【发布时间】:2014-10-25 00:07:52
【问题描述】:

我有以下代码

int i, a, z;  
i = 2343243443;  
a = 5464354324324324;  
z = i * a;  
cout << z << endl;  

当这些相乘时,它给我 -1431223188 这不是答案。我怎样才能让它给我正确的答案?

【问题讨论】:

标签: c++ integer multiplication


【解决方案1】:

结果溢出 int(还有std::uint64_t

你必须使用一些 BigInt 库。

【讨论】:

    【解决方案2】:

    正如 Jarod42 建议的那样,完全可以,但我不确定是否会发生溢出?

    尝试将数字的每个数字存储在一个数组中,然后相乘。你一定会得到正确答案的。

    有关如何使用数组进行乘法的更多详细信息,请关注此帖子http://discuss.codechef.com/questions/7349/computing-factorials-of-a-huge-number-in-cc-a-tutorial

    【讨论】:

    • 2343243443 已经溢出 int32(但不是 uint32),所以是的,存在溢出。
    • 我有兴趣将每个数字存储在一个数组中然后相乘,但我想不通。相当复杂。
    【解决方案3】:

    使用我们在第二个标准中使用的泛纸方法。 以相反的顺序将两个数字存储在两个不同的数组中。并将ans数组作为(arr1.size + arr2.size)的大小。并将ans数组初始化为零。

    在你的情况下 arr1[10]={3,4,4,3,4,2,3,4,3,2}, arr2[15]={4,2,3,4,2,3,,4,5,3,4,5,3,4,6,4,5};

    for(int i=0;i<arr1_length;i++)
    {
        for(int j=0;j<arr2_length;j++)
        {
    
            ans[i+j]+=arr1[i]*arr2[j];
            ans[i+j+1]=ans[i+j+1]+ans[i+j]/10;
            ans[i+j]%=10;
        }
    }
    

    然后ans数组包含结果。请仔细打印ans数组。它可能包含前导零。

    【讨论】:

      【解决方案4】:

      int 只保存 32 位。当乘法的结果大于 2^31 - 1 时,结果将翻转为较大的负值。不要使用 int 数据类型,而是使用 long long int,它拥有 64 位。

      【讨论】:

        【解决方案5】:

        您应该首先尝试使用 64 位数字(long 或更好,如果一切都是正数,则为 unsigned long)。使用 unsigned long 您可以在 0 和 18446744073709551615 之间进行操作,long 在 -9223372036854775808 和 9223372036854775807 之间进行操作。

        如果还不够,那么没有简单的解决方案,您必须在软件级别使用 unsigned long 数组执行操作,并重载“

        如果 64 位表示对您来说还不够,我认为您应该考虑浮点表示,尤其是“双精度”。使用 double,您可以表示大约 -10^308 和 10^308 之间的数字。您将无法对非常大的数字进行完全准确的计算(不会计算最低有效数字),但这对于您想要在这里做的任何事情来说应该是一个足够好的选择。

        【讨论】:

          【解决方案6】:

          首先,你必须让你的价值做多做多 其次,您需要在乘法前添加一个 (long long)。这是因为当您拥有 (ab) 时,它会返回一个 int,因此如果您希望它返回 long long,您会想要 (long long)(ab)。

          【讨论】:

          • 您好!一些提示:请考虑在回答之前查看unanswered questions;在考虑使用已被接受的答案回答问题时,请先查看其他答案,然后再给出自己的答案。
          【解决方案7】:

          您可以使用队列数据结构找到两个非常大的数字的乘积 O(n*m)。 n 和 m 是数字中的位数。

          【讨论】:

          • 如果你提供一个 C++ 代码 sn-p 来支持你的答案,那不是更酷吗?
          【解决方案8】:

          我想使用成熟的代码详细说明和澄清 Shravan Kumar 的答案。代码以长整数 a 和 b 开头,使用数组相乘,转换为字符串,然后返回长整数。

          #include <iostream>
          #include <string>
          #include<algorithm>
          
          using namespace std;
          
          int main()
          {
          //Numbers to be multiplied
          long a=111,b=100;
          
          //Convert them to strings (or character array)
          string arr1 = to_string(a), arr2 = to_string(b); 
          
          //Reverse them
          reverse(arr1.begin(), arr1.end());
          reverse(arr2.begin(), arr2.end());
          
          //Getting size for final result, just to avoid dynamic size
          int ans_size = arr1.size() + arr2.size();
          
          //Declaring array to store final result
          int ans[ans_size]={0};
          
          //Multiplying 
          //In a reverse manner, just to avoid reversing strings explicitly 
          for(int i=0; i<arr1.size();i++)
          {
              for(int j=0; j<arr2.size();j++)
              {
                  //Convert array elements (char -> int)
                  int p = (int)(arr1[i]) - '0';
                  int q = (int)(arr2[j]) - '0';
          
                  //Excerpt from Shravan's answer above
                  ans[i+j]+=p*q;
                  ans[i+j+1]=ans[i+j+1]+ans[i+j]/10;
                  ans[i+j]%=10;
              }
          }
          
          //Declare array to store string form of final answer
          string s="";
          
          for(auto i=0;i<ans_size; ++i)
              s += to_string(ans[i]); 
          
          reverse(s.begin(), s.end() );
          
          //If last element is 0, it should be skipped
          if(s[0] =='0')
          {
             string ss(s,1,s.size()-1);
             s=ss;
          }
          
          //Final answer
          cout<< s;
          
          return 0;
          }
          

          【讨论】:

            【解决方案9】:
            // its may heplfull for you
            #include<stdio.h>
            #include<stdlib.h>
            #include<string.h>
            #include<math.h>
            #define MAX 1000
            void reverse(char *from, char *to ){
                int len=strlen(from);
                int l;
                for(l=0;l<len;l++)to[l]=from[len-l-1];
                to[len]='\0';
            }
            void call_mult(char *first,char *sec,char *result){
                char F[MAX],S[MAX],temp[MAX];
                int f_len,s_len,f,s,r,t_len,hold,res;
                f_len=strlen(first);
                s_len=strlen(sec);
                reverse(first,F);
                reverse(sec,S);
                t_len=f_len+s_len;
                r=-1;
                for(f=0;f<=t_len;f++)temp[f]='0';
                temp[f]='\0';
                for(s=0;s<s_len;s++){
                    hold=0;
                    for(f=0;f<f_len;f++){
                        res=(F[f]-'0')*(S[s]-'0') + hold+(temp[f+s]-'0');
                        temp[f+s]=res%10+'0';
                        hold=res/10;
                        if(f+s>r) r=f+s;
                    }
                    while(hold!=0){
                        res=hold+temp[f+s]-'0';
                        hold=res/10;
                        temp[f+s]=res%10+'0';
                        if(r<f+s) r=f+s;
                        f++;
                    }
                }
                for(;r>0 && temp[r]=='0';r--);
                temp[r+1]='\0';
                reverse(temp,result);
            }
            int main(){
                char fir[MAX],sec[MAX],res[MAX];
                while(scanf("%s%s",&fir,&sec)==2){
                    call_mult(fir,sec,res);
                    int len=strlen(res);
                    for(int i=0;i<len;i++)printf("%c",res[i]);
                    printf("\n");
                }
                return 0;
            }
            

            【讨论】:

              猜你喜欢
              • 2015-05-23
              • 1970-01-01
              • 1970-01-01
              • 2015-05-08
              • 1970-01-01
              • 1970-01-01
              • 2019-09-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多