Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将两个大数字相乘?_C++_Algorithm_Math - Fatal编程技术网

C++ 如何将两个大数字相乘?

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

我创建了一个小的控制台应用程序,可以乘以2个长整数。 我不知道我的问题在哪里。此应用程序可以正常工作,直到位数为3

但如果数字大于3,则应用程序的输出是错误的(

请告诉我我的问题在哪里,我要解决它

这是我的密码:

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));