鱼C论坛

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

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

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

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

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

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

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

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

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

inline void scan_d(int* num)   //快速输入函数代码
{
        char in;
        in = getchar();
        if (in == EOF) return;
        while (in != '-' && (in < '0' || in>'9')) in = getchar();
        if (in == '-') { *num = 0; }
        else *num = in - '0';
        while (in = getchar(), in >= '0' && in <= '9') {
                *num *= 10, * num += in - '0';
        }
        return;
}

int main()
{
        int N, score, q[12] = {0};
        scan_d(&N);
        for (int i = 1;i <= N;i++) {
                scan_d(&score);         
                q[score/10]+=1;         //计算分数余数并增加改分数段人数
        }
        cout << q[10] + q[9]<<' ' << q[8]<< ' ' << q[7]<< ' ' << q[6]<<' ' << q[5] + q[4] + q[3] + q[2] + q[1]+q[0];
}


答案代码
int a[120];
int main()
{
        int A = 0, B = 0, C = 0, D = 0, E = 0;
        int N = 0, score, i = 0;
        scan_d(&N);
        for (i = 1; i <= N; i++)
        {
                scan_d(&score);
                a[score]++;
        }
        i = 0;
        for (; i < 60; i++)
                E += a[i];
        for (; i < 70; i++)
                D += a[i];
        for (; i < 80; i++)
                C += a[i];
        for (; i < 90; i++)
                B += a[i];
        for (; i <= 100; i++)
                A += a[i];

        printf("%d %d %d %d %d", A, B, C, D, E);
        return 0;
}
其他部分一样,所以没打出来
疑问,为什么用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

计算机不会列竖式试商。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-16 18:22:42 | 显示全部楼层
除法费时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 10:23:18 | 显示全部楼层
E+=a;
D+=a;
是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


为什么除法费时
想知道小甲鱼最近在做啥?请访问 -> 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

计算机不会列竖式试商。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哦,我懂了,除法简单来说每次是进行多步操作,谢谢解答,再冒昧地提个问题,if中的比较操作是只进行一步操作吗?
想知道小甲鱼最近在做啥?请访问 -> 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

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢解答,不过我看不懂汇编语言,以后课程才会学,所以说是if操作的时间更短吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


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

使用道具 举报

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

你这就离谱,难道你算除法是循环减法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

请编程计算
98765432101234567890987654321234567890 / 1234567890987654321
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

题目的数据量是六百万。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

还请你解释一下为什么除法慢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 12:54:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

要真的是纯减法,你用到的电脑就得慢死了……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

我说用减法实现除法有错吗有错吗?
而且,你的链接给的代码算不出我出的题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是说 125/5 不得 5 吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


98765432101234567890987654321234567890 / 1234567890987654321
这个它算不出来,当然,还有更长的。比如说计算PI,计算e
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


你这是离谱,C语言能存这么大的数?uint64 都装不下,你逗我呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 13:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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