int — Как я могу умножить действительно большие числа Переполнение стека

У меня есть следующий код

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

Когда они умножаются, это дает мне -1431223188, который не является ответом. Как я могу заставить его дать мне правильный ответ?

4

Решение

Как предположил Jarod42, все в порядке, но я не уверен, произойдет ли переполнение или нет?

Попробуйте сохранить каждую цифру числа в массиве и после этого умножить. Вы обязательно получите правильный ответ.

Для более подробной информации о том, как умножить, используя массив, следуйте этому посту http://discuss.codechef.com/questions/7349/computing-factorials-of-a-huge-number-in-cc-a-tutorial

3

Другие решения

Результат переполняет int (а также std::uint64_t)

Вы должны использовать библиотеку BigInt.

5

Интты содержат только 32 бита. Когда результат умножения больше 2 ^ 31 — 1, результат переходит на большое отрицательное значение. Вместо использования типа данных int используйте long long int, который содержит 64 бита.

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. может содержать ведущий ноль.

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

Сначала вы должны попытаться использовать 64-битные числа (длинные или лучше, беззнаковые длинные, если все положительно). С длинным без знака вы можете работать между 0 и 18446744073709551615, с длинным между -9223372036854775808 и 9223372036854775807.

Если этого недостаточно, то простого решения не существует, вы должны выполнить свою работу на программном уровне, например, с использованием массивов unsigned long и перегрузки ».<<Оператор для отображения. Но это не так просто, и я думаю, вы новичок (без обид), учитывая вопрос, который вы задали.

Если вам недостаточно 64-битного представления, я думаю, вам следует рассмотреть представление с плавающей запятой, особенно «двойное». С помощью double вы можете представлять числа от -10 ^ 308 до 10 ^ 308. Вы не сможете иметь абсолютно точные вычисления для очень большого числа (наименее значимые цифры не будут вычислены), но это должно быть достаточно хорошим вариантом для всего, что вы хотите сделать здесь.

0
По вопросам рекламы [email protected]