我正在运行此代码::
#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编译器上运行它时,它运行时没有任何错误。
我尝试过做什么?
我试图解决一个问题,我们必须找到&#34;数字&#34;的数量,与原始数字的数字相同。所以,我试图使用排列和组合公式来获得更大的数字。
查看代码,有一行我已评论&#34; errorLine&#34; 。 如果我将代码的那一行改为this ::
int currentDigit = numberTemp % 10;
然后我的程序终止了! 所以,这条线可能有问题。但我不知道模数陈述会出现什么问题。
为什么在我的系统上,在IDE代码块和NetBeans上都出现了问题?
P.S。我知道代码在逻辑上是不正确的。
提前致谢!
答案 0 :(得分:2)
计算powerOf10
(已经导致UB)并且变为负数时,您的整数会溢出。
您不能将除数的余数除以负数。
显然10
不会溢出,因此您的测试不会表现出相同的行为。
答案 1 :(得分:1)
如果您使用new []
分配内存,则需要使用delete []
来释放内存。所以:
delete digits;
应该是:
delete [] digits;