C/C++交流
- // 求100的阶乘
- #include <stdio.h>
- #define MAX 10000
- #define num 100
- int 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]);
复制代码这样就可以正确地找到后面第一个非零的数,并从后向前输出。
希望这能帮助到你,如果还有其他问题,请随时向我提问。
球一个最佳答案谢谢啦!这对我非常重要!

