模块化计算器中的错误答案

时间:2015-12-12 20:39:29

标签: c++

我创建了一个模块化计算器,用于执行一系列数学执行,最后采用以前所有内容的mod。但是,我继续得到错误的结果。

#include <iostream>
using namespace std;
int main(){
    int num1, num2, ans = 0;
    char oper = ' ';
    cin >> num1>> oper >> num2;
    //The first time
    if (oper == '*')
        ans =num1*num2;
    else if (oper == '+')
        ans = num1+num2;
    //other times
    do {
        cin>> oper >> num2;
        if (oper == '*')
            ans =ans*num2;
        else if (oper == '+')
            ans = ans+num2;
    } while (oper!='%');
    if (oper == '%')
        ans = (ans % num2);
    cout<<ans;
}

输入:

4
* 8805
* 99
* 12
+ 6
+ 367
* 575
+ 66
+ 9
* 8
* 8
* 711
+ 130
* 5
+ 5
+ 1
+ 73
* 811
* 33
+ 56
+ 80
* 350
* 116
+ 179
* 383
* 12
+ 59
+ 5150
* 10
+ 5
+ 8783
* 48
* 84
* 7
+ 390
+ 7057
* 10
+ 8366
+ 8856
* 99
* 9
+ 3019
+ 228
* 334
+ 75
+ 6353
+ 7151
* 8
% 1408

输出:-1240 预期:808

有任何解释吗? (BigIntdoubleunsigned int代替int似乎无法解决任何问题;我已尝试过所有这些内容。

1 个答案:

答案 0 :(得分:2)

由于 int 溢出,你得错了答案。

让我们举个例子

让我们说下面的输入

class MyLibrary {

    private $type2;

    public function __construct($params)
    {
        echo $params['type'];

        //I WANT TO DISPLAY TYPE2 BY HELLO FUNCTION
        $this->type2 = 'asdasdasd';
    }

    public function hello()
    {

        return $this->type2;
    }

}

你的程序会给出错误的答案,因为

首次输入后,ans = 4 * 432 = 1728

第二次输入后,ans = 1732 * 432 = 746496(大于 int 最高范围,它出现int溢出并给出错误答案)

出于这个原因,我们可以使用下面的模数算术公式,以便我们可以让 int 溢出。

  1. (A + B)%R =(A%R + B%R)%R
  2. (A * B)%R =(A%R * B%R)%R
  3. 为了您的信息, (26 + 3 * 2)%3 =(26%3 + 3%3 * 2%3)%3

    试试这个

    4
    * 432
    * 422
    * 432
    % 8