鱼C论坛

 找回密码
 立即注册
查看: 4832|回复: 48

[已解决]有人可以帮我分析一下小甲鱼的程序吗?

[复制链接]
发表于 2022-4-12 11:32:56 | 显示全部楼层 |阅读模式

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

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

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

  1. #include <stdio.h>

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

  6.         for (i = 5; i < 10000; i++) {
  7.                 for (j = 2; j < i / 2; j++) {
  8.                         if (i % j == 0) {
  9.                                 flag = 0;
  10.                                 break;
  11.                         }
  12.                 }

  13.                 if (flag) {
  14.                         count++;
  15.                 } else {
  16.                         flag = 1;
  17.                 }
  18.         }

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

  20.         return 0;
  21. }
复制代码


小甲鱼这样写的话,素数不会被重复计算吗?就比如13是一个素数,它不能被2整除会让count+1,不能被3整除又会让count+,不能被4整数又会让count+1这样子
  1. if (flag) {
  2.                         count++;
  3.                 } else {
  4.                         flag = 1;
  5.                 }
复制代码
uTools_1649734155835.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-12 11:51:18 | 显示全部楼层
已解决
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 12:33:44 | 显示全部楼层    本楼为最佳答案   
同题讨论见https://fishc.com.cn/thread-211741-1-1.html
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 12:52:07 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 12:33
同题讨论见https://fishc.com.cn/thread-211741-1-1.html

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

  2. int main() {
  3.         int ch;
  4.         printf("请输入:");

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

  9.         }

  10.         putchar('\n');

  11.         return 0;
  12. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 12:52:42 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 12:33
同题讨论见https://fishc.com.cn/thread-211741-1-1.html

我输的范围是0到10,也是不行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:05:54 | 显示全部楼层
1613551 发表于 2022-4-12 12:52
我输的范围是0到10,也是不行

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

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

  3. int main(void) {
  4.     if('0' == 0) printf("'0' == 0\n");
  5.     if('0' == 48) printf("'0' == 48\n");
  6.     printf("%d\n", '0');
  7.     return 0;
  8. }
  9. $ gcc-debug -o main main.c
  10. $ ./main
  11. '0' == 48
  12. 48
  13. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你要明白,字符里面没有10
是字符1后面放一个字符0
不是字符10
没有字符10
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:10:55 | 显示全部楼层
1613551 发表于 2022-4-12 12:52
老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问 ...
  1. #include <stdio.h>

  2. int main() {
  3.         int ch;
  4.         printf("请输入:");

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

  10.         }

  11.         putchar('\n');

  12.         return 0;
  13. }
复制代码

  1. #include <stdio.h>

  2. int main() {
  3.         int ch;
  4.         printf("请输入:");

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

  10.         }

  11.         putchar('\n');

  12.         return 0;
  13. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:11:54 | 显示全部楼层
  1. #include <stdio.h>

  2. int main() {
  3.         int ch;
  4.         printf("请输入:");

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

  11.         }

  12.         putchar('\n');

  13.         return 0;
  14. }
复制代码

  1. #include <stdio.h>

  2. int main() {
  3.         int ch;
  4.         printf("请输入:");

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

  12.         }

  13.         putchar('\n');

  14.         return 0;
  15. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 13:32:16 | 显示全部楼层

呜呜呜,懂了懂了,但是我还有最后一个疑惑,putchar的输出条件是什么呢?也就是putchar什么时候会把字符打印出来,如果在循环里面就是结束了循环才会输出吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  1. 其中,ASCII 字符表上的数字 0~31 以及 127(共 33 个)分配给了控制字符,用于控制像打印机等一些外围设备
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

也就是putchar什么时候会把字符打印出来
在你给putchar的数字是可打印字符的时候,putchar就会把字符打印出来
和循环无关
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 13:44:53 | 显示全部楼层
本帖最后由 1613551 于 2022-4-12 13:46 编辑
人造人 发表于 2022-4-12 13:36
也就是putchar什么时候会把字符打印出来
在你给putchar的数字是可打印字符的时候,putchar就会把字符打 ...


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

  2. int main()
  3. {
  4.         int ch;

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

  6.         while ((ch = getchar()) != '\n')
  7.         {
  8.                 if (ch >= 'a' && ch <= 'z')
  9.                 {
  10.                         putchar('a' + (ch - 'a' + 3) % 26);
  11.                         continue;
  12.                 }

  13.                 if (ch >= 'A' && ch <= 'Z')
  14.                 {
  15.                         putchar('A' + (ch - 'A' + 3) % 26);
  16.                         continue;
  17.                 }

  18.                 putchar(ch);
  19.         }

  20.         putchar('\n');

  21.         return 0;
  22. }
复制代码

当执行到这一步的时候为什么没有把值给输出出来呢?
  1. putchar('a' + (ch - 'a' + 3) % 26);
复制代码

是因为当时ch里面还没有值,是等于\n的时候,geichar()才把值给ch,然后putchar才输出的吗?
  1. while ((ch = getchar()) != '\n')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:46:22 | 显示全部楼层
1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序

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

第几行的putchar ?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 13:47:47 | 显示全部楼层
人造人 发表于 2022-4-12 13:46
第几行的putchar ?

第13和第19,就是当执行到这一步的时候为什么没有把putchar里面的值给输出出来,而是当while的值为0,结束循环的时候才输出putchar的值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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'就一定会执行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

二、
因为这里定义的ch是整型,如果你按照上面的思路进行修改可输入的范围,如
  1. if(char >= 32 && char <= 126)
复制代码

(该范围ASCII码代表可见字符)
再次运行程序,输入比如65(试图输出字符“A“)
你会发现还是什么都没有

这里是因为getchar()同样一次只接收一个字符,你输入65实际上是因为while循环两次的结果
等同于
  1. getchar(6);
  2. getchar(5);
复制代码

结合第一段,所以什么都没有才是正确结果

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

如果执意要用int类型,那么就把输入函数换掉,getchar()一次只能接收一个字符
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不是的,这些我知道,我在想要怎么给你解释这个问题,这个问题困扰了我好久
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-10 11:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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