簡體   English   中英

我怎樣才能乘以非常大的數字c ++

[英]How can I multiply really big numbers c++

我有以下代碼

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

使用我們在第二個標准中使用的泛紙方法。 以相反的順序將兩個數字存儲在兩個不同的數組中。 並將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數組。 它可能包含前導零。

整數只保存 32 位。 當乘法的結果大於 2^31 - 1 時,結果將翻轉為較大的負值。 不要使用 int 數據類型,而是使用 long long int,它包含 64 位。

您應該首先嘗試使用 64 位數字(long 或更好,如果一切都是正數,則為 unsigned long)。 使用 unsigned long 您可以在 0 和 18446744073709551615 之間進行操作,long 在 -9223372036854775808 和 9223372036854775807 之間進行操作。

如果還不夠,那么就沒有簡單的解決方案,您必須在軟件級別使用 unsigned long 數組執行操作,並重載“<<”運算符以進行顯示。 但這並不容易,考慮到您提出的問題,我想您是初學者(無意冒犯)。

如果 64 位表示對您來說還不夠,我認為您應該考慮浮點表示,尤其是“雙精度”。 使用 double,您可以表示大約 -10^308 和 10^308 之間的數字。 您將無法對非常大的數字進行完全准確的計算(不會計算最低有效數字),但這對於您想要在這里做的任何事情來說應該是一個足夠好的選擇。

首先,您必須使您的值 long longs 其次,您需要在乘法前添加一個 (long long)。 這是因為當您擁有 (a b) 時,它會返回一個 int,因此如果您希望它返回 long long,您會想要 (long long)(a b)。

我想使用成熟的代碼詳細說明和澄清 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;
}

https://www.geeksforgeeks.org/advanced-c-boost-library/

嘗試使用boost庫。 它將幫助您乘以大數字。 訪問上面的鏈接了解更多。

改用float 它可以上升到大約 3.4028235 × 10 38

// 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;
}

您可以使用隊列數據結構以 O(n*m) 查找兩個非常大的數字的乘積。 n 和 m 是數字中的位數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM