C 中的程序,使用 3 位数字但不使用 5 位数字
Program in C , working with 3 digits but not working with 5 digits
145
= 1! + 4! + 5!
的总和。我需要用 C 编写一个程序,找到具有 属性.
的 5 位数字
3位代码我写成功了。我用同样的代码输入 5 位数字,但找不到任何数字。
我想帮助我解决我的问题,以便我看到我错在哪里。
#include <stdio.h>
int factorial(int n);
main() {
int pin[5];
int q = 1;
int w = 0;
int e = 0;
int r = 0;
int t = 0;
int result = 0;
int sum = 0;
for (q = 1; q <= 9; q++) {
for (w = 0; w <= 9; w++) {
for (e = 0; e <= 9; e++) {
for (r = 0; r <= 9; r++) {
for (t = 0; t <= 9; t++) {
pin[0] = q;
pin[1] = w;
pin[2] = e;
pin[3] = r;
pin[4] = t;
int factq = factorial(q);
int factw = factorial(w);
int facte = factorial(e);
int factr = factorial(r);
int factt = factorial(t);
sum = factq + factw + facte + factr + factt;
result = 10000 * q + 1000 * w + 100 * e + 10 * r + t * 1;
if (sum == result)
printf("ok");
}
}
}
}
}
}
int factorial(int n) {
int y;
if (n == 1) {
y = 1;
} else if (n == 0)
y = 0;
else {
y = n * factorial(n - 1);
return y;
}
}
您的 factorial
函数并非在所有情况下都 return 值:
int factorial (int n) {
int y;
if (n==1) {
y = 1;
}
else
if (n==0)
y = 0;
else {
y = n * factorial(n-1);
return y;
}
}
它只有return在进行递归调用时有一个值。基本情况没有 return 任何东西。无法 return 函数中的值然后尝试使用该值调用 undefined behavior.
将 return
语句移动到函数的底部,以便在所有情况下都会调用它。 0!
的值也是 1,而不是 0。
int factorial (int n) {
int y;
if (n<=1)
y = 1;
else
y = n * factorial(n-1);
return y;
}
此外,当您找到目标值时,您可能想要打印它:
printf("ok: %d\n", result);
dbush 的回答准确地指出了您的代码无法运行的原因。这是一种替代解决方案,通过不在每一步都重新计算每个数字的阶乘来减少程序的计算量。你的程序目前的工作方式,最终是从你的嵌套循环调用阶乘函数大约 500,000 次,然后从嵌套循环中每次调用递归调用该函数平均 4ish 次,所以大约有 200 万次调用factorial
。您添加的数字越多,数字增长得越快,价格也越高。为避免所有这些重新计算,您可以创建一个 Look-up table
来存储数字 [0-9]
的阶乘,并根据需要查找它们。
您可以提前计算这些值并用这些值初始化您的 LUT,但如果假设您希望它们由程序计算,因为这是一个编程任务,您不能删除这样的步骤,填充 LUT 仍然非常简单。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
void populate_lut(uint32_t *lut);
int main(void) {
// lut is an array holding the factorials of numerals 0-9
uint32_t lut[10];
populate_lut(lut);
for (uint8_t q = 1; q <= 9; q++) {
for (uint8_t w = 0; w <= 9; w++) {
for (uint8_t e = 0; e <= 9; e++) {
for (uint8_t r = 0; r <= 9; r++) {
for (uint8_t t = 0; t <= 9; t++) {
// now instead of calculating these factorials, just look them up in the look-up table
uint32_t sum = lut[q] + lut[w] + lut[e] + lut[r] + lut[t];
uint32_t result = 10000 * q + 1000 * w + 100 * e + 10 * r + t * 1;
if (sum == result) {
printf("Solution: %" PRIu32 "\n", result);
}
}
}
}
}
}
}
// populate your lookup table with the factorials of digits 0-9
void populate_lut(uint32_t *lut) {
lut[0] = 1;
lut[1] = 1;
for(uint8_t i = 2; i < 10; ++i) {
lut[i] = lut[i-1] * i;
}
}
145
= 1! + 4! + 5!
的总和。我需要用 C 编写一个程序,找到具有 属性.
3位代码我写成功了。我用同样的代码输入 5 位数字,但找不到任何数字。
我想帮助我解决我的问题,以便我看到我错在哪里。
#include <stdio.h>
int factorial(int n);
main() {
int pin[5];
int q = 1;
int w = 0;
int e = 0;
int r = 0;
int t = 0;
int result = 0;
int sum = 0;
for (q = 1; q <= 9; q++) {
for (w = 0; w <= 9; w++) {
for (e = 0; e <= 9; e++) {
for (r = 0; r <= 9; r++) {
for (t = 0; t <= 9; t++) {
pin[0] = q;
pin[1] = w;
pin[2] = e;
pin[3] = r;
pin[4] = t;
int factq = factorial(q);
int factw = factorial(w);
int facte = factorial(e);
int factr = factorial(r);
int factt = factorial(t);
sum = factq + factw + facte + factr + factt;
result = 10000 * q + 1000 * w + 100 * e + 10 * r + t * 1;
if (sum == result)
printf("ok");
}
}
}
}
}
}
int factorial(int n) {
int y;
if (n == 1) {
y = 1;
} else if (n == 0)
y = 0;
else {
y = n * factorial(n - 1);
return y;
}
}
您的 factorial
函数并非在所有情况下都 return 值:
int factorial (int n) {
int y;
if (n==1) {
y = 1;
}
else
if (n==0)
y = 0;
else {
y = n * factorial(n-1);
return y;
}
}
它只有return在进行递归调用时有一个值。基本情况没有 return 任何东西。无法 return 函数中的值然后尝试使用该值调用 undefined behavior.
将 return
语句移动到函数的底部,以便在所有情况下都会调用它。 0!
的值也是 1,而不是 0。
int factorial (int n) {
int y;
if (n<=1)
y = 1;
else
y = n * factorial(n-1);
return y;
}
此外,当您找到目标值时,您可能想要打印它:
printf("ok: %d\n", result);
dbush 的回答准确地指出了您的代码无法运行的原因。这是一种替代解决方案,通过不在每一步都重新计算每个数字的阶乘来减少程序的计算量。你的程序目前的工作方式,最终是从你的嵌套循环调用阶乘函数大约 500,000 次,然后从嵌套循环中每次调用递归调用该函数平均 4ish 次,所以大约有 200 万次调用factorial
。您添加的数字越多,数字增长得越快,价格也越高。为避免所有这些重新计算,您可以创建一个 Look-up table
来存储数字 [0-9]
的阶乘,并根据需要查找它们。
您可以提前计算这些值并用这些值初始化您的 LUT,但如果假设您希望它们由程序计算,因为这是一个编程任务,您不能删除这样的步骤,填充 LUT 仍然非常简单。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
void populate_lut(uint32_t *lut);
int main(void) {
// lut is an array holding the factorials of numerals 0-9
uint32_t lut[10];
populate_lut(lut);
for (uint8_t q = 1; q <= 9; q++) {
for (uint8_t w = 0; w <= 9; w++) {
for (uint8_t e = 0; e <= 9; e++) {
for (uint8_t r = 0; r <= 9; r++) {
for (uint8_t t = 0; t <= 9; t++) {
// now instead of calculating these factorials, just look them up in the look-up table
uint32_t sum = lut[q] + lut[w] + lut[e] + lut[r] + lut[t];
uint32_t result = 10000 * q + 1000 * w + 100 * e + 10 * r + t * 1;
if (sum == result) {
printf("Solution: %" PRIu32 "\n", result);
}
}
}
}
}
}
}
// populate your lookup table with the factorials of digits 0-9
void populate_lut(uint32_t *lut) {
lut[0] = 1;
lut[1] = 1;
for(uint8_t i = 2; i < 10; ++i) {
lut[i] = lut[i-1] * i;
}
}