鱼C论坛

 找回密码
 立即注册
查看: 2235|回复: 28

[已解决]高效输入和高效算法

[复制链接]
发表于 2020-11-16 15:54:07 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 不爱听课的同学 于 2020-11-17 12:24 编辑

自己找了快速输入的代码,但算法过程太慢超时了,看了一下答案不懂为什么答案比较快

题目详情 和另外 1 个页面 - 个人 - Microsoft Edge 2020_11_16 15_44_46.png

自己的超时代码
  1. #include <iostream>
  2. using namespace std;

  3. inline void scan_d(int* num)   //快速输入函数代码
  4. {
  5.         char in;
  6.         in = getchar();
  7.         if (in == EOF) return;
  8.         while (in != '-' && (in < '0' || in>'9')) in = getchar();
  9.         if (in == '-') { *num = 0; }
  10.         else *num = in - '0';
  11.         while (in = getchar(), in >= '0' && in <= '9') {
  12.                 *num *= 10, * num += in - '0';
  13.         }
  14.         return;
  15. }

  16. int main()
  17. {
  18.         int N, score, q[12] = {0};
  19.         scan_d(&N);
  20.         for (int i = 1;i <= N;i++) {
  21.                 scan_d(&score);         
  22.                 q[score/10]+=1;         //计算分数余数并增加改分数段人数
  23.         }
  24.         cout << q[10] + q[9]<<' ' << q[8]<< ' ' << q[7]<< ' ' << q[6]<<' ' << q[5] + q[4] + q[3] + q[2] + q[1]+q[0];
  25. }
复制代码



答案代码
  1. int a[120];
  2. int main()
  3. {
  4.         int A = 0, B = 0, C = 0, D = 0, E = 0;
  5.         int N = 0, score, i = 0;
  6.         scan_d(&N);
  7.         for (i = 1; i <= N; i++)
  8.         {
  9.                 scan_d(&score);
  10.                 a[score]++;
  11.         }
  12.         i = 0;
  13.         for (; i < 60; i++)
  14.                 E += a[i];
  15.         for (; i < 70; i++)
  16.                 D += a[i];
  17.         for (; i < 80; i++)
  18.                 C += a[i];
  19.         for (; i < 90; i++)
  20.                 B += a[i];
  21.         for (; i <= 100; i++)
  22.                 A += a[i];

  23.         printf("%d %d %d %d %d", A, B, C, D, E);
  24.         return 0;
  25. }
复制代码

其他部分一样,所以没打出来
疑问,为什么用if选择结构处理更快
最佳答案
2020-11-17 10:46:41
本帖最后由 xieglt 于 2020-11-17 10:48 编辑

除法的本质是循环减法
125/25 = 5 表达的意思 125 按每份 25 来分可以平均分成 5 份
计算方法是
125-25 = 100       count = 1
100-25 =75          count = 2
75-25 = 50           count = 3
50-25 = 25           count = 4
25-25 =0              count = 5
所以125/25=5

计算机不会列竖式试商。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-16 18:22:42 | 显示全部楼层
除法费时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 10:23:18 | 显示全部楼层
E+=a;
D+=a;
是什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-17 10:34:33 | 显示全部楼层


为什么除法费时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 10:46:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-11-17 10:48 编辑

除法的本质是循环减法
125/25 = 5 表达的意思 125 按每份 25 来分可以平均分成 5 份
计算方法是
125-25 = 100       count = 1
100-25 =75          count = 2
75-25 = 50           count = 3
50-25 = 25           count = 4
25-25 =0              count = 5
所以125/25=5

计算机不会列竖式试商。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-17 10:58:16 | 显示全部楼层
xieglt 发表于 2020-11-17 10:46
除法的本质是循环减法
125/25 = 5 表达的意思 125 按每份 25 来分可以平均分成 5 份
计算方法是

哦,我懂了,除法简单来说每次是进行多步操作,谢谢解答,再冒昧地提个问题,if中的比较操作是只进行一步操作吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 11:11:34 | 显示全部楼层
本帖最后由 xieglt 于 2020-11-17 11:18 编辑
不爱听课的同学 发表于 2020-11-17 10:58
哦,我懂了,除法简单来说每次是进行多步操作,谢谢解答,再冒昧地提个问题,if中的比较操作是只进行一步 ...


代码里没看到 IF
if ( i >= 60 && i <=70)  翻译成汇编指令大概是这样的。
         MOV EAX,I
         CMP  EAX,60
         JL    _false
         CMP  EAX,70
         JG   _false
_true:
         .....
_false:
         .....

score/10 除法指令大概是这样的

xor edx,edx
mov eax,score
mov ebx,10
div ebx

从指令来看,除法指令更简单一些。但是每个指令执行时间是不一样的。


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-17 11:23:46 | 显示全部楼层
xieglt 发表于 2020-11-17 11:11
代码里没看到 IF
if ( i >= 60 && i

谢谢解答,不过我看不懂汇编语言,以后课程才会学,所以说是if操作的时间更短吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 11:30:39 | 显示全部楼层
不爱听课的同学 发表于 2020-11-17 11:23
谢谢解答,不过我看不懂汇编语言,以后课程才会学,所以说是if操作的时间更短吗?

我没看到代码里有IF,不知道你说的IF是指的什么。

不过我觉得,这种级别的数据处理,根本感觉不出来差异。
数据上10万,百万才能感觉到差异。


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-17 12:00:06 | 显示全部楼层
本帖最后由 不爱听课的同学 于 2020-11-17 12:08 编辑
xieglt 发表于 2020-11-17 11:30
我没看到代码里有IF,不知道你说的IF是指的什么。

不过我觉得,这种级别的数据处理,根本感觉不出来差 ...


啊看错了,答案是用for循环,我表述得不明确,应该是判断指令和除法指令那个耗时更多。其实这个题目要求算法高效,我一直在想为什么答案的算法这么快,是否有其他解法?实在想不通。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 12:42:42 | 显示全部楼层
xieglt 发表于 2020-11-17 10:46
除法的本质是循环减法
125/25 = 5 表达的意思 125 按每份 25 来分可以平均分成 5 份
计算方法是

你这就离谱,难道你算除法是循环减法?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 12:44:45 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-11-17 12:42
你这就离谱,难道你算除法是循环减法?

请编程计算
98765432101234567890987654321234567890 / 1234567890987654321
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 12:45:06 | 显示全部楼层
xieglt 发表于 2020-11-17 11:30
我没看到代码里有IF,不知道你说的IF是指的什么。

不过我觉得,这种级别的数据处理,根本感觉不出来差 ...

题目的数据量是六百万。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 12:54:48 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-11-17 12:45
题目的数据量是六百万。

还请你解释一下为什么除法慢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 12:54:51 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-17 19:52:24 | 显示全部楼层
xieglt 发表于 2020-11-17 12:44
请编程计算
98765432101234567890987654321234567890 / 1234567890987654321

https://www.zhihu.com/question/55707696
麻烦学会利用网络……

要真的是纯减法,你用到的电脑就得慢死了……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 19:58:59 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-11-17 19:52
https://www.zhihu.com/question/55707696
麻烦学会利用网络……

要真的是纯减法,你用到的电脑就 ...

我说用减法实现除法有错吗有错吗?
而且,你的链接给的代码算不出我出的题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 20:04:56 | 显示全部楼层
xieglt 发表于 2020-11-17 19:58
我说用减法实现除法有错吗有错吗?
而且,你的链接给的代码算不出我出的题。

是说 125/5 不得 5 吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 20:06:07 | 显示全部楼层


98765432101234567890987654321234567890 / 1234567890987654321
这个它算不出来,当然,还有更长的。比如说计算PI,计算e
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 20:07:31 | 显示全部楼层
xieglt 发表于 2020-11-17 20:06
98765432101234567890987654321234567890 / 1234567890987654321
这个它算不出来,当然,还有更长的。 ...


你这是离谱,C语言能存这么大的数?uint64 都装不下,你逗我呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 05:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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