高效输入和高效算法
本帖最后由 不爱听课的同学 于 2020-11-17 12:24 编辑自己找了快速输入的代码,但算法过程太慢超时了,看了一下答案不懂为什么答案比较快
自己的超时代码
#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 = {0};
scan_d(&N);
for (int i = 1;i <= N;i++) {
scan_d(&score);
q+=1; //计算分数余数并增加改分数段人数
}
cout << q + q<<' ' << q<< ' ' << q<< ' ' << q<<' ' << q + q + q + q + q+q;
}
答案代码
int a;
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++;
}
i = 0;
for (; i < 60; i++)
E += a;
for (; i < 70; i++)
D += a;
for (; i < 80; i++)
C += a;
for (; i < 90; i++)
B += a;
for (; i <= 100; i++)
A += a;
printf("%d %d %d %d %d", A, B, C, D, E);
return 0;
}
其他部分一样,所以没打出来
疑问,为什么用if选择结构处理更快 除法费时 E+=a;
D+=a;
是什么? 永恒的蓝色梦想 发表于 2020-11-16 18:22
除法费时
为什么除法费时 本帖最后由 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
计算机不会列竖式试商。 xieglt 发表于 2020-11-17 10:46
除法的本质是循环减法
125/25 = 5 表达的意思 125 按每份 25 来分可以平均分成 5 份
计算方法是
哦,我懂了,除法简单来说每次是进行多步操作,谢谢解答,再冒昧地提个问题,if中的比较操作是只进行一步操作吗? 本帖最后由 xieglt 于 2020-11-17 11:18 编辑
不爱听课的同学 发表于 2020-11-17 10:58
哦,我懂了,除法简单来说每次是进行多步操作,谢谢解答,再冒昧地提个问题,if中的比较操作是只进行一步 ...
代码里没看到 IF
if ( i >= 60 && i <=70)翻译成汇编指令大概是这样的。
MOV EAX,I
CMPEAX,60
JL _false
CMPEAX,70
JG _false
_true:
.....
_false:
.....
score/10 除法指令大概是这样的
xor edx,edx
mov eax,score
mov ebx,10
div ebx
从指令来看,除法指令更简单一些。但是每个指令执行时间是不一样的。
xieglt 发表于 2020-11-17 11:11
代码里没看到 IF
if ( i >= 60 && i
谢谢解答,不过我看不懂汇编语言,以后课程才会学,所以说是if操作的时间更短吗? 不爱听课的同学 发表于 2020-11-17 11:23
谢谢解答,不过我看不懂汇编语言,以后课程才会学,所以说是if操作的时间更短吗?
我没看到代码里有IF,不知道你说的IF是指的什么。
不过我觉得,这种级别的数据处理,根本感觉不出来差异。
数据上10万,百万才能感觉到差异。
本帖最后由 不爱听课的同学 于 2020-11-17 12:08 编辑
xieglt 发表于 2020-11-17 11:30
我没看到代码里有IF,不知道你说的IF是指的什么。
不过我觉得,这种级别的数据处理,根本感觉不出来差 ...
啊看错了,答案是用for循环,我表述得不明确,应该是判断指令和除法指令那个耗时更多。其实这个题目要求算法高效,我一直在想为什么答案的算法这么快,是否有其他解法?实在想不通。 xieglt 发表于 2020-11-17 10:46
除法的本质是循环减法
125/25 = 5 表达的意思 125 按每份 25 来分可以平均分成 5 份
计算方法是
你这就离谱,难道你算除法是循环减法? 永恒的蓝色梦想 发表于 2020-11-17 12:42
你这就离谱,难道你算除法是循环减法?
请编程计算
98765432101234567890987654321234567890 / 1234567890987654321 xieglt 发表于 2020-11-17 11:30
我没看到代码里有IF,不知道你说的IF是指的什么。
不过我觉得,这种级别的数据处理,根本感觉不出来差 ...
题目的数据量是六百万。 永恒的蓝色梦想 发表于 2020-11-17 12:45
题目的数据量是六百万。
还请你解释一下为什么除法慢。 {:10_269:} xieglt 发表于 2020-11-17 12:44
请编程计算
98765432101234567890987654321234567890 / 1234567890987654321
https://www.zhihu.com/question/55707696
麻烦学会利用网络……
要真的是纯减法,你用到的电脑就得慢死了…… 永恒的蓝色梦想 发表于 2020-11-17 19:52
https://www.zhihu.com/question/55707696
麻烦学会利用网络……
要真的是纯减法,你用到的电脑就 ...
我说用减法实现除法有错吗有错吗?
而且,你的链接给的代码算不出我出的题。 xieglt 发表于 2020-11-17 19:58
我说用减法实现除法有错吗有错吗?
而且,你的链接给的代码算不出我出的题。
是说 125/5 不得 5 吗? 永恒的蓝色梦想 发表于 2020-11-17 20:04
是说 125/5 不得 5 吗?
98765432101234567890987654321234567890 / 1234567890987654321
这个它算不出来,当然,还有更长的。比如说计算PI,计算e xieglt 发表于 2020-11-17 20:06
98765432101234567890987654321234567890 / 1234567890987654321
这个它算不出来,当然,还有更长的。 ...
你这是离谱,C语言能存这么大的数?uint64 都装不下,你逗我呢
页:
[1]
2