2015-07-13 2 views
-4

Я новичок в C++. Я пытаюсь использовать это длинное целочисленное умножение. Я не понимаю, как изменяется значение sum[3][0] в последующем цикле цикла.длинное целочисленное умножение в C++

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string num1, num2; 
    int i,j,l1, l2,temp,k; 
    cout << "Enter first number: "; 
    cin >> num1; 
    cout << "Enter second number: "; 
    cin >> num2; 
    l1= num1.size(); 
    l2= num2.size(); 

    cout << l1 << " " << l2 << endl; 

    int sum[l2-1][l2];  //   5 6 7 8 ---> num1 
           //   1 2 3 4 ---> num2 
    for(i=0; i<l1; i++)  //  --------- 
     num1[i]-='0';   //  2 2 7 1 2 sum[3][4]---->sum[3][0] 
           //  1 7 0 3 4   i.e sum[3][0] should be 2 
    for(i=0; i<l2; i++)  // 1 1 3 5 6 
     num2[i]-='0';   // 5 6 7 8 
           // ------------- 
    for(i=l2-1; i>=0; i--) // 7 0 0 6 6 5 2 
    { 
     k=0; 
     temp=0; 
     for(j=l1-1; j>=0; j--) 
     { 
      temp+=(num2[i]*num1[j]); 
      sum[i][k]= temp%10; 
      temp=temp/10; 
      k++; 
     } 
     sum[i][k]=temp; 
     cout << sum[3][0] << endl; 
    } 

    for(i=l2-1; i>=0; i--)  // output is 2 2 7 1 1  Here value of sum[3][0] is 1 but the desired output is 2. 
    {       //   1 7 0 3 1 
     for(k=l2; k>=0; k--) //   1 1 3 5 0 
      cout << sum[i][k]; //   0 5 6 7 8 
     cout << endl; 
    } 


    return 0; 
} 

Я пробовал этот код для случая num1 = 5678 и num2 = 1234. Таким образом, сумма [3] [0] должна быть равна 2 в этом случае.

+3

Просьба уточнить причину проблемы. Какой результат вы получаете, какой результат вы ожидаете и почему? – Petr

+0

Я ожидаю, что сумма [3] [0] должна хранить 2 для упомянутого выше случая. Но я получаю 1 в качестве вывода. –

+0

Что такое 'sum'? Что он представляет? –

ответ

0

sum массив должен быть создать так:

int sum[l2][max(l1,l2)+1]; 

Он слишком мал, чтобы хранить результаты расчетов вас в настоящее время.

Почему программа не сбой при выписывании из границ массива? Поскольку C++ не имеет проверки границ массива.

Чтобы быть честным, вы должны объявить массив на new и удалить его delete, когда он больше не понадобится. C++ стандарт не предусматривает создание массива неизменного размера без new. Только некоторые компиляторы поддерживают его как расширение, и многие из них печатают предупреждения, когда вы это делаете. Подробнее: How do I declare a 2d array in C++ using new?

1

Вы не сделали сумму достаточно большой. Вы используете сумму [0..l2-1] [0..l1], поэтому размер должен быть равен сумме [l2] [l1 + 1].

Если вы превысите вторую тусклую сумму, которая обычно составляет часть одной строки суммарного хранилища с частью другого, то место, где вы сохранили сумму [2] [0], - это то же место, где вы позже сохранили сумму [ 1] [4]

Если вы превысили первую тусклую сумму (или вторую тусклую в последней строке), которая делает хранилище общего количества акций другими вещами, такими как (но не обязательно), другие переменные, локальные для этой функции ,

Кроме того, ваша петля для отображения суммы неверна. Вы используете строки суммы от l2-1 до 0 и столбцы от 0 до L1. Но вы показываете столбцы l2 до 0. Столбцы вычисляются на основе l1, поэтому они должны отображаться на основе l1. Эта ошибка будет иметь симптомы, если вы попробуете пример с l1, не равным l2.

Смежные вопросы