C++ 如何将两个大数字相乘?
我创建了一个小的控制台应用程序,可以乘以2个长整数。 我不知道我的问题在哪里。此应用程序可以正常工作,直到位数为3 但如果数字大于3,则应用程序的输出是错误的( 请告诉我我的问题在哪里,我要解决它 这是我的密码:C++ 如何将两个大数字相乘?,c++,algorithm,math,C++,Algorithm,Math,我创建了一个小的控制台应用程序,可以乘以2个长整数。 我不知道我的问题在哪里。此应用程序可以正常工作,直到位数为3 但如果数字大于3,则应用程序的输出是错误的( 请告诉我我的问题在哪里,我要解决它 这是我的密码: int digits (int n) { int counter = 0; while (n > 0) { n/=10; counter++; } return counter; } long longMu
int digits (int n)
{
int counter = 0;
while (n > 0)
{
n/=10;
counter++;
}
return counter;
}
long longMultiply(long a, long b)
{
const int S = 3;
int w,x,y,z;
int n = max(digits(a),digits(b));
if(a == 0 || b ==0) {
return 0;
} else if (n <= S) {
return a*b;
} else {
int m = (n/2);
//first number
x = a/(10^m);
y = a%(10^m);
//second number
w = b/(10^m);
z = b%(10^m);
return (longMultiply(x,w)*(10^(2*m)) + (longMultiply(x,z) + longMultiply(w,y)))*(10^m) + longMultiply(y,z) ;
}
}
int main() {
//digits(12345);
cout << longMultiply(100,100);
return 0;
}
int位(int n)
{
int计数器=0;
而(n>0)
{
n/=10;
计数器++;
}
返回计数器;
}
长乘(长a、长b)
{
常数int S=3;
整数w,x,y,z;
int n=最大值(数字(a),数字(b));
如果(a==0 | | b==0){
返回0;
}否则,如果(n10^m不是10的m次方,事实上,这是m的10异或
您可以使用cmath库()中的pow
函数,但它适用于浮点数
或者,要得到10^m,您可以简单地将1m乘以10
int m = (n/2);
long tenToM = 1;
for (int i=0; i<m; i++)
tenToM *= 10;
long tenToTwoM = tenToM * tenToM;
intm=(n/2);
长tenToM=1;
对于(inti=0;i10^m不是10的m次方,事实上这是由m进行的10异或
您可以使用cmath库()中的pow
函数,但它适用于浮点数
或者,要得到10^m,您可以简单地将1m乘以10
int m = (n/2);
long tenToM = 1;
for (int i=0; i<m; i++)
tenToM *= 10;
long tenToTwoM = tenToM * tenToM;
intm=(n/2);
长tenToM=1;
对于(int i=0;i似乎您的问题在else部分的逻辑中。它最多工作3位,因为它只是在输出产品,当失败时,它运行您的else块,我不确定我是否理解。设置m=n/2
试图做什么?似乎您的问题在else部分的逻辑中。它最多可以工作3位,因为它只是在输出产品时失败,它会运行我不确定是否理解的else块。设置m=n/2
试图做什么?如果产品小于或等于10^18;
你可以简单地使用
long long product = a * b ;
如果a或b大于长-长范围;
一个可以简单地取一个和字符串一样长,另一个和字符串一样长。
假设a>10^18,b<10^18。
以下代码仅在b*9在长-长范围内时有效
string a ; long long b ;
cin >> a >> b ;
reverse ( a.begin() , a.end() ) ;
string prod ;
long long temp ,carry ;
temp = carry = 0 ;
for ( i = 0 ; i < a.length() ; i++ ){
temp = (a[i] - '0') * b + carry ;
prod += ( temp % 10 ) + '0' ;
carry = temp / 10 ;
}
while ( carry != 0 ){
prod += ( carry % 10 ) + '0' ;
carry /= 10 ;
}
reverse ( prod.begin() , prod.end() ) ;
cout << prod ; // this string contains the required product .
字符串a;长b;
cin>>a>>b;
相反(a.开始(),a.结束());
串针;
长温,携带;
温度=进位=0;
对于(i=0;i 如果乘积小于或等于10^18,则cout;
你可以简单地使用
long long product = a * b ;
如果a或b大于长-长范围;
一个可以简单地取一个和字符串一样长,另一个和字符串一样长。
假设a>10^18,b<10^18。
以下代码仅在b*9在长-长范围内时有效
string a ; long long b ;
cin >> a >> b ;
reverse ( a.begin() , a.end() ) ;
string prod ;
long long temp ,carry ;
temp = carry = 0 ;
for ( i = 0 ; i < a.length() ; i++ ){
temp = (a[i] - '0') * b + carry ;
prod += ( temp % 10 ) + '0' ;
carry = temp / 10 ;
}
while ( carry != 0 ){
prod += ( carry % 10 ) + '0' ;
carry /= 10 ;
}
reverse ( prod.begin() , prod.end() ) ;
cout << prod ; // this string contains the required product .
字符串a;长b;
cin>>a>>b;
相反(a.开始(),a.结束());
串针;
长温,携带;
温度=进位=0;
对于(i=0;i 难道没有错误结果的例子吗?如果数字的数量比tahn 3大,我得到wrang答案。例如,当longMultiply(9999999)时,我得到正确的答案。但是当值是longMultiply(1000*1000)时,我得到错误的答案。有错误结果的例子吗?如果数字比tahn 3大,我得到wrang答案。例如,当longMultiply(1000*1000)时,我得到错误的答案(999999)我得到了正确的答案。但是当值是longpluply(1000*1000)时,我得到了错误的答案。我如何修复它…?!我如何修复它…?!n=max(数字(a),数字(b));n=max(数字(a),数字(b));