我有以下代码
int i, a, z;
i = 2343243443;
a = 5464354324324324;
z = i * a;
cout << z << endl;
当它们相乘时,它给出了-1431223188,这不是答案。我怎样才能让它给我正确的答案?
答案 0 :(得分:5)
结果溢出了int(以及std::uint64_t
)
你必须使用一些BigInt库。
答案 1 :(得分:4)
正如Jarod42建议完全没问题,但我不确定是否会发生溢出?
尝试将数字中的每个数字存储在一个数组中,之后相乘。你一定会得到正确答案。
有关如何使用数组的更多详细信息,请按照此帖http://discuss.codechef.com/questions/7349/computing-factorials-of-a-huge-number-in-cc-a-tutorial
进行操作答案 2 :(得分:2)
整数只能容纳32位。当乘法的结果大于2 ^ 31 - 1时,结果将翻转为较大的负值。不要使用int数据类型,而是使用long long int,它包含64位。
答案 3 :(得分:1)
使用第2标准中使用的泛纸方法。 以相反顺序将两个数字存储在两个不同的数组中。并将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 :(得分:1)
首先,您必须长期创造自己的价值 其次,您需要在乘法前面添加一个(长长)。这是因为当您拥有(a b)时,它会返回一个int值,因此,如果您希望它返回很长的整型,则需要(long long)(a b)。
答案 5 :(得分:0)
// 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;
}
答案 6 :(得分:0)
你应该首先尝试使用64位数字(长或更好,无符号长,如果一切都是正数)。使用无符号长整数,您可以在0到18446744073709551615之间运行,长度在-9223372036854775808和9223372036854775807之间。
如果还不够,那么就没有简单的解决方案,你必须使用unsigned long数组在软件级别执行操作,并重载“&lt;&lt;”操作员显示。但这并不容易,考虑到你提出的问题,我猜你是初学者(没有冒犯)。
如果64位表示对你来说还不够,我认为你应该考虑浮点表示,尤其是“双重”。使用double,您可以表示大约-10 ^ 308到10 ^ 308之间的数字。你将无法对非常大的数字进行完全准确的计算(最低有效数字将不会被计算),但对于你想在这里做的任何事情,这应该是一个足够好的选择。
答案 7 :(得分:0)
您可以使用队列数据结构来查找O(n * m)的两个非常大的数的乘积。 n和m是数字中的位数。
答案 8 :(得分:0)
我想使用完整的代码详细说明并阐明Shravan Kumar的答案。代码以长整数a和b开头,这些整数使用数组乘以,转换为字符串,然后返回为long int。
#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;
}