鱼C论坛

 找回密码
 立即注册
查看: 1000|回复: 2

[已解决]小白求助

[复制链接]
发表于 2023-11-8 08:46:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//求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;
}
打印100的阶乘。请问为什么最后在数组搜索中,搜到的第一个数是-1而不是0?
最佳答案
2023-11-8 08:47:10
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]);
这样就可以正确地找到后面第一个非零的数,并从后向前输出。

希望这能帮助到你,如果还有其他问题,请随时向我提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-8 08:46:54 | 显示全部楼层
在这段代码中,数组NUM的索引范围是0到MAX-1,即0到9999。在while循环中,k的初始值是MAX,即9999。然后,先执行了--NUM[k]操作,将NUM[9999]的值减1,变为-1。然后再进行循环条件的判断,由于-1不等于0,所以循环继续执行。因此,最后在数组搜索中,搜到的第一个数是-1而不是0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-8 08:47:10 | 显示全部楼层    本楼为最佳答案   
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]);
这样就可以正确地找到后面第一个非零的数,并从后向前输出。

希望这能帮助到你,如果还有其他问题,请随时向我提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 03:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表