C/C++交流// 求100的阶乘 #include <stdio.h>#define MAX 10000#define num 100int main(void){ int NUM[MAX] = {1}; int j, k; for (j = 1; j <= num; j++) { for (k = 0; k < MAX; k++) { // 将各个元素乘以n NUM[k] *= j; } // 判断是否要进位 for (k = 0; k < MAX - 1; k++) { if (NUM[k] >= 10) NUM[k + 1] += NUM[k] / 10; NUM[k] %= 10; } } // 找到后面第一个非零的数,从后向前输出 k = MAX; while (--NUM[k] == 0) continue; for (; k >= 0; k--) printf("%d", NUM[k]); return 0;}
在你提供的代码中,需要注意一下几点:
1. 在循环中找到后面第一个非零的数时,使用了 --NUM[k] 来判断。这里可能会引起混淆,因为 --NUM[k] 实际上是先减少 NUM[k] 的值,然后再进行比较和判断。
2. 另外,由于数组下标是从 0 开始的,所以在打印时需要从 k 的值为 MAX-1 的位置开始,一直打印到 0 的位置。
针对你的问题,为什么最后在数组搜索中,搜到的第一个数是-1而不是0?这是因为在 while 循环中,--NUM[k] 操作会导致 k 对应位置的值减少 1,并且 while 循环的条件是检查 NUM[k] 是否等于 0,因此当 NUM[k] 为 1 时,--NUM[k] 操作会使得 NUM[k] 变为 0,然后才进行循环体内的操作。因此,在循环结束后,k 对应位置的值实际上是 NUM[k] - 1,也就是 -1。
为了解决这个问题,你可以将循环改成如下形式:// 找到后面第一个非零的数,从后向前输出k = MAX - 1;while (NUM[k] == 0 && k > 0) { k--;}for (; k >= 0; k--) printf("%d", NUM[k]);
这样就可以正确地找到后面第一个非零的数,并从后向前输出。
希望这能帮助到你,如果还有其他问题,请随时向我提问。
球一个最佳答案谢谢啦!这对我非常重要! |