代码 c++ 中的运行时错误

RunTime error in code c++

本文关键字:运行时错误 c++ 代码      更新时间:2023-10-16

>我正在运行这段代码:

#include <iostream>
using namespace std;
int findNumbers(int number, int power);
int findPow(int base, int power);
int fact(int n);
int main() {
    int n;
    cin >> n;
    cout << findNumbers(n, 1);
}
int findNumbers(int number, int power) {
    int powerOf10 = findPow(10, power);
    int numberTemp = number / (powerOf10/10);
    int currentDigit = numberTemp % powerOf10; //errorLine
    if (number/(powerOf10/10) == 0)
        return 0;
    int ans = findNumbers(number, power + 1);
    int *digits = new int[10]();
    for(int i = 0; i < 10; i++)
        digits[i] = 0;
    for(int i = power - 1; i > 0; i--) {
        int power10temp = findPow(10, i);
        int digitTemp = number % power10temp;
        digits[digitTemp]++;
    }
    digits[currentDigit]++;
    int numerator = fact(power - 1);
    for(int i = currentDigit + 1; i < 10; i++) {
        int denominator = 1;
        if(digits[i] != 0) {
            digits[i]--;
            for(int j = 0; j < 10; j++) {
                denominator = denominator * fact(digits[i]);
            }
            ans = ans + (numerator/denominator);
            digits[i]++;
        }
    }
    delete digits;
    cout << ans << endl;
    return ans;
}
int fact(int n) {
    if (n <= 1)
        return 1;
    return n*fact(n-1);
}
int findPow(int base, int power) {
    int ans = 1;
    for(int i = 0; i < power; i++) {
        ans = ans * base;
    }
    return ans;
}

我一直在尝试在我的CodeBlocks和Netbeans IDE中运行此代码。但是,在这两种情况下,程序都会在两者之间挂起,可能是由于某些运行时错误。但是,当我尝试在 ideone 编译器上运行它时,它运行没有任何错误。

我尝试过做什么?

我试图解决一个问题,我们必须找到"数字"的数量,这些数字由与原始数字相同的数字组成。因此,我正在尝试使用排列和组合公式来增加数字的数量。

请参阅代码,有一行我注释了"errorLine"。如果我将那行代码更改为以下内容:

    int currentDigit = numberTemp % 10; 

然后我的程序终止!所以,这条线可能有问题。但我不知道模数陈述可能有什么问题。

为什么在我的系统上,在 IDE 的代码块和 NetBeans 上都出现了故障?

附言我知道代码在逻辑上是不正确的。

提前感谢!

计算 powerOf10 时整数溢出(这已经导致 UB)并变为负数。

不能将除法的余数乘以负数。

显然,10永远不会溢出,因此您的测试不会表现出相同的行为。

如果使用new []来分配内存,则需要使用 delete [] 来释放它。所以:

delete digits;

应该是:

delete [] digits;