1613551 发表于 2022-4-12 11:32:56

有人可以帮我分析一下小甲鱼的程序吗?

下面就是小甲鱼计算 10000 以内的素数个数的程序

#include <stdio.h>

int main() {
        int count = 2; // 已知2和3是素数
        int i, j;
        _Bool flag = 1;

        for (i = 5; i < 10000; i++) {
                for (j = 2; j < i / 2; j++) {
                        if (i % j == 0) {
                                flag = 0;
                                break;
                        }
                }

                if (flag) {
                        count++;
                } else {
                        flag = 1;
                }
        }

        printf("10000以内共有%d个素数!\n", count);

        return 0;
}

小甲鱼这样写的话,素数不会被重复计算吗?就比如13是一个素数,它不能被2整除会让count+1,不能被3整除又会让count+,不能被4整数又会让count+1这样子
if (flag) {
                        count++;
                } else {
                        flag = 1;
                }

1613551 发表于 2022-4-12 11:51:18

已解决

风车呼呼呼 发表于 2022-4-12 12:33:44

同题讨论见https://fishc.com.cn/thread-211741-1-1.html

1613551 发表于 2022-4-12 12:52:07

风车呼呼呼 发表于 2022-4-12 12:33
同题讨论见https://fishc.com.cn/thread-211741-1-1.html

老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问问为什么这样子,我putchar啥都打印不了啊
#include <stdio.h>

int main() {
        int ch;
        printf("请输入:");

        while ((ch = getchar()) != '\n') {
                if (ch >= 0 && ch <= 10) {
                        putchar(ch);
                }

        }

        putchar('\n');

        return 0;
}

1613551 发表于 2022-4-12 12:52:42

风车呼呼呼 发表于 2022-4-12 12:33
同题讨论见https://fishc.com.cn/thread-211741-1-1.html

我输的范围是0到10,也是不行

人造人 发表于 2022-4-12 12:58:19

1613551 发表于 2022-4-12 12:52
老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问 ...

putchar 函数要一个数字,然后putchar函数查ascii表,找到这个数字对应的字符,然后输出这个字符
例如
putchar(48);
putchar查ascii表,发现48对应的字符是 0
然后putchar输出 字符0
putchar(48); 和 putchar('0'); 是一回事,一样的,写法不一样,效果完全一样,一个意思

https://fishc.com.cn/thread-67427-1-1.html

人造人 发表于 2022-4-12 13:05:54

1613551 发表于 2022-4-12 12:52
我输的范围是0到10,也是不行

字符0可不是数字0
字符是用ascii码表示的
是用数字48来表示字符0的

$ cat main.c
#include <stdio.h>

int main(void) {
    if('0' == 0) printf("'0' == 0\n");
    if('0' == 48) printf("'0' == 48\n");
    printf("%d\n", '0');
    return 0;
}
$ gcc-debug -o main main.c
$ ./main
'0' == 48
48
$

人造人 发表于 2022-4-12 13:08:48

1613551 发表于 2022-4-12 12:52
老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问 ...

你要明白,字符里面没有10
是字符1后面放一个字符0
不是字符10
没有字符10

人造人 发表于 2022-4-12 13:10:55

1613551 发表于 2022-4-12 12:52
老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问 ...

#include <stdio.h>

int main() {
      int ch;
      printf("请输入:");

      while ((ch = getchar()) != '\n') {
                //if (ch >= 0 && ch <= 10) {
                if (ch >= '0' && ch <= '9') {
                        putchar(ch);
                }

      }

      putchar('\n');

      return 0;
}


#include <stdio.h>

int main() {
      int ch;
      printf("请输入:");

      while ((ch = getchar()) != '\n') {
                //if (ch >= 0 && ch <= 10) {
                if (ch >= 48 && ch <= 57) {
                        putchar(ch);
                }

      }

      putchar('\n');

      return 0;
}

人造人 发表于 2022-4-12 13:11:54

#include <stdio.h>

int main() {
      int ch;
      printf("请输入:");

      while ((ch = getchar()) != '\n') {
                //if (ch >= 0 && ch <= 10) {
                //if (ch >= 48 && ch <= 57) {
                if (ch >= '0' && ch <= 57) {
                        putchar(ch);
                }

      }

      putchar('\n');

      return 0;
}


#include <stdio.h>

int main() {
      int ch;
      printf("请输入:");

      while ((ch = getchar()) != '\n') {
                //if (ch >= 0 && ch <= 10) {
                //if (ch >= 48 && ch <= 57) {
                //if (ch >= '0' && ch <= 57) {
                if (ch >= 48 && ch <= '9') {
                        putchar(ch);
                }

      }

      putchar('\n');

      return 0;
}

1613551 发表于 2022-4-12 13:32:16

人造人 发表于 2022-4-12 13:11


呜呜呜,懂了懂了,但是我还有最后一个疑惑,putchar的输出条件是什么呢?也就是putchar什么时候会把字符打印出来,如果在循环里面就是结束了循环才会输出吗?

人造人 发表于 2022-4-12 13:34:57

1613551 发表于 2022-4-12 13:32
呜呜呜,懂了懂了,但是我还有最后一个疑惑,putchar的输出条件是什么呢?也就是putchar什么时候会把字符 ...

没看懂你的问题
putchar函数会输出可打印字符,控制字符不输出

其中,ASCII 字符表上的数字 0~31 以及 127(共 33 个)分配给了控制字符,用于控制像打印机等一些外围设备

人造人 发表于 2022-4-12 13:36:32

1613551 发表于 2022-4-12 13:32
呜呜呜,懂了懂了,但是我还有最后一个疑惑,putchar的输出条件是什么呢?也就是putchar什么时候会把字符 ...

也就是putchar什么时候会把字符打印出来
在你给putchar的数字是可打印字符的时候,putchar就会把字符打印出来
和循环无关

1613551 发表于 2022-4-12 13:44:53

本帖最后由 1613551 于 2022-4-12 13:46 编辑

人造人 发表于 2022-4-12 13:36
也就是putchar什么时候会把字符打印出来
在你给putchar的数字是可打印字符的时候,putchar就会把字符打 ...

就比如小甲鱼的这个程序
#include <stdio.h>

int main()
{
      int ch;

      printf("请输入明文:");

      while ((ch = getchar()) != '\n')
      {
                if (ch >= 'a' && ch <= 'z')
                {
                        putchar('a' + (ch - 'a' + 3) % 26);
                        continue;
                }

                if (ch >= 'A' && ch <= 'Z')
                {
                        putchar('A' + (ch - 'A' + 3) % 26);
                        continue;
                }

                putchar(ch);
      }

      putchar('\n');

      return 0;
}
当执行到这一步的时候为什么没有把值给输出出来呢?
putchar('a' + (ch - 'a' + 3) % 26);
是因为当时ch里面还没有值,是等于\n的时候,geichar()才把值给ch,然后putchar才输出的吗?
while ((ch = getchar()) != '\n')

人造人 发表于 2022-4-12 13:46:22

1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序

当执行到这一步的时候为什么没有把ch的值给输出出来呢?


第几行的putchar ?

1613551 发表于 2022-4-12 13:47:47

人造人 发表于 2022-4-12 13:46
第几行的putchar ?

第13和第19,就是当执行到这一步的时候为什么没有把putchar里面的值给输出出来,而是当while的值为0,结束循环的时候才输出putchar的值

人造人 发表于 2022-4-12 13:49:50

1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序

当执行到这一步的时候为什么没有把值给输出出来呢?


第13行的putchar要不要执行,这取决于第11行的if
第11行的if条件成立就执行13行和14行,不成立就不执行13行和14行
19行和20行由17行的if来决定要不要执行
23行的putchar只要是ch不是 '\n'就一定会执行

风车呼呼呼 发表于 2022-4-12 13:50:11

1613551 发表于 2022-4-12 12:52
老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问 ...

一、
putchar()函数是输出一个字符
当给它的参数不是一个字符常量如“A”,也不是字符变量,如之前有定义
char a = 'A';

而是一个整型数,如65,那么putchar()函数输出的是以这个整型数为ASCII码所代表的字符,即“A”(字符A的ASCII码是65)

又因为0~31、127号ASCII码代表的都是控制字符,而非可见字符,所以你传入0~9当然什么都看不到(至于单拎10出去,这又是另一个问题了,见下)

二、
因为这里定义的ch是整型,如果你按照上面的思路进行修改可输入的范围,如
if(char >= 32 && char <= 126)
(该范围ASCII码代表可见字符)
再次运行程序,输入比如65(试图输出字符“A“)
你会发现还是什么都没有

这里是因为getchar()同样一次只接收一个字符,你输入65实际上是因为while循环两次的结果
等同于getchar(6);
getchar(5);
结合第一段,所以什么都没有才是正确结果

三、
关于修改
最简单的是把ch定义为char类型,然后把if判断去掉(或者对着ASCII码表来选定你想要限制的输入范围)

如果执意要用int类型,那么就把输入函数换掉,getchar()一次只能接收一个字符

人造人 发表于 2022-4-12 13:52:49

1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序

当执行到这一步的时候为什么没有把值给输出出来呢?


第11行的if要不要执行,这取决于第9行的while
while条件成立就执行10行到24行的内容
11行的if自然在10行到24行之间,所以9行的while决定要不要执行11行的if

1613551 发表于 2022-4-12 13:58:34

人造人 发表于 2022-4-12 13:52
第11行的if要不要执行,这取决于第9行的while
while条件成立就执行10行到24行的内容
11行的if自然在10 ...

不是的,这些我知道,我在想要怎么给你解释这个问题,这个问题困扰了我好久
页: [1] 2 3
查看完整版本: 有人可以帮我分析一下小甲鱼的程序吗?