У меня есть следующий код
int i, a, z;
i = 2343243443;
a = 5464354324324324;
z = i * a;
cout << z << endl;
Когда они умножаются, это дает мне -1431223188, который не является ответом. Как я могу заставить его дать мне правильный ответ?
Как предположил Jarod42, все в порядке, но я не уверен, произойдет ли переполнение или нет?
Попробуйте сохранить каждую цифру числа в массиве и после этого умножить. Вы обязательно получите правильный ответ.
Для более подробной информации о том, как умножить, используя массив, следуйте этому посту http://discuss.codechef.com/questions/7349/computing-factorials-of-a-huge-number-in-cc-a-tutorial
Результат переполняет int (а также std::uint64_t
)
Вы должны использовать библиотеку BigInt.
Интты содержат только 32 бита. Когда результат умножения больше 2 ^ 31 — 1, результат переходит на большое отрицательное значение. Вместо использования типа данных int используйте long long int, который содержит 64 бита.
Используйте бумажный подход, как мы использовали во втором стандарте.
Храните два числа в двух разных массивах в обратном порядке. И принять массив 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. может содержать ведущий ноль.
// 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;
}
Сначала вы должны попытаться использовать 64-битные числа (длинные или лучше, беззнаковые длинные, если все положительно). С длинным без знака вы можете работать между 0 и 18446744073709551615, с длинным между -9223372036854775808 и 9223372036854775807.
Если этого недостаточно, то простого решения не существует, вы должны выполнить свою работу на программном уровне, например, с использованием массивов unsigned long и перегрузки ».<<Оператор для отображения. Но это не так просто, и я думаю, вы новичок (без обид), учитывая вопрос, который вы задали.
Если вам недостаточно 64-битного представления, я думаю, вам следует рассмотреть представление с плавающей запятой, особенно «двойное». С помощью double вы можете представлять числа от -10 ^ 308 до 10 ^ 308. Вы не сможете иметь абсолютно точные вычисления для очень большого числа (наименее значимые цифры не будут вычислены), но это должно быть достаточно хорошим вариантом для всего, что вы хотите сделать здесь.