我是C ++的初学者。我正在尝试这个长整数乘法。我不理解sum[3][0]
的值在后续循环周期中是如何变化的。
#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。因此,在这种情况下,sum [3] [0]应为2。
答案 0 :(得分:1)
你的金额不够大。你使用sum [0..l2-1] [0..l1]所以大小需要是sum [l2] [l1 + 1]。
当你超过第二个dim dim时,通常会将一行sum share存储的一部分与另一行共享,所以你存储sum [2] [0]的地方就是你以后存储的地方sum [1 ] [4]
当你超过sum的第一个dim(或最后一行的第二个dim)时,它会与其他东西共享存储,例如(但不一定)该函数的本地其他变量。
此外,显示总和的循环不正确。您可以使用从l2-1到0的总和以及从0到L1的列。但是您将列l2显示为0.列是基于l1计算的,因此应基于l1显示。如果您尝试使用l1不等于l2的示例,则该错误会出现症状。
答案 1 :(得分: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?