我怎样才能把真正大的数字乘以c++

How can I multiply really big numbers c++

本文关键字:数字 c++      更新时间:2023-10-16

我有以下代码

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

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

结果溢出int(以及std::uint64_t

你必须使用一些BigInt库。

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

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

有关如何使用数组相乘的更多详细信息,请参阅本文http://discuss.codechef.com/questions/7349/computing-factorials-of-a-huge-number-in-cc-a-tutorial

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

就你而言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;
    }
}

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

int只包含32位。当乘法运算的结果大于2^31-1时,结果会滚动到一个大负值。不要使用int数据类型,而是使用long-long-int,它包含64位。

您应该首先尝试使用64位数字(长或更好,如果所有数字都是正数,则为无符号长)。使用无符号long,您可以在0和18446744073709551615之间进行操作,long可以在9223372036854775808和9223372036864775807之间进行操作。

如果这还不够,那么就没有简单的解决方案,例如,您必须使用无符号长数组在软件级别执行操作,并重载"<<"运算符进行显示。但这并不是那么容易,考虑到你问的问题,我想你是个初学者(无意冒犯)。

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

首先,您必须使您的值变长第二,你想在乘法前面加一个(long-long)。这是因为当你有(ab)时,它会返回一个int,因此如果你想让它返回一个你想要的长-长(long-long)(ab)。

我想用一个完整的代码详细说明并澄清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;
}

请改用float。它可以达到3.4028235×1038

// 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]='';
}
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]='';
    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]='';
    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;
}

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