算法的三种描述方式
算法的三种描述方式
熟练运用自然语言、流程图、伪代码方式来描述算法。
同一算法可以用三种方式写出来。自然语言用完整句子讲清「先做什么、再做什么」,适合说明思路,但容易含糊。流程图用约定符号画结构:矩形表示处理、菱形表示判断、平行四边形表示输入输出、箭头表示流向;循环要画清回边。伪代码介于二者之间:保留缩进与 if/while 骨架,但不拘泥于 C++ 语法。三级要求能在三种写法之间互译,而不是背符号表本身。
客观题会给一段自然语言,问对应哪张流程图,或给伪代码问循环执行次数。判断题常考「菱形只能写赋值」「伪代码必须能直接编译」。编程题一般直接写 C++,但读题时你仍在做「自然语言 → 步骤」的翻译。认证标准规定考试时长为 120 分钟,看流程图务必顺着箭头走完,不要只扫矩形里的公式。
// 伪代码「从 1 累加到 n」对应的 C++
int s = 0;
for (int i = 1; i <= n; ++i)
s += i;
// 自然语言:令 s 为 0;i 从 1 到 n,每次把 i 加进 s。
// 流程图:处理框初始化 → 菱形判断 i 与 n → 处理框累加 → 回边。
三种描述必须对应同一控制流;改了循环方向却声称「还是这个算法」,判断题会判错。
一个算法可以用不同的形式来描述,但要求描述比较规范,因此不能用自然语言描述。
下列流程图的输出结果是?( )

原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写版式题干
原卷作
洛谷有题用 CDN 外链图;官方 PDF 第 1 页流程图为嵌入位图,已抽为 content/assets/gesp-cpp-l3-2023-09/fig-01.png(宽 400)替换。
已按官方原件恢复:现为原卷原文
下面流程图在 yr 输入 2024 时,可以判定 yr 代表闰年,并输出 2月是29天,则图中菱形框中应该填入( )。

下列流程图的输出结果是( )。

求小于等于 N 的素数的方法中,有一种方法是将所有从 2 到它本身减 1 的数都除一遍,如果不能整除,就是素数。下列哪个程序,体现了这种方法( )?
A.
if(N >= 3){
cout<<2<<endl;
for(int i = 2;i <= N;i ++){
for(int j = 2;j < i;j ++){
if(i % j != 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
flag = 0;
}
}
B.
if(N >= 2){
for(int i = 3;i <= N;i ++){
for(int j = 2;j < i;j ++){
if(i % j == 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
flag = 0;
}
}
C.
if(N >= 2){
cout<<2<<endl;
for(int i = 3;i <= N;i ++){
for(int j = 2;j < i;j ++){
if(i % j == 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
flag = 0;
}
}
D.
if(N >= 2){
cout<<2<<endl;
for(int i = 3;i <= N;i ++){
for(int j = 2;j < i;j ++){
if(i % j == 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
}
}
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写数值印错题干
原卷作
if(N >= 2){洛谷有题将选项 B/C/D 的 N >= 2 写成 N > 2;已按官方 PDF 第 6–7 页恢复。
已按官方原件恢复:现为原卷原文
闰年的定义:
- 普通闰年:公历年份是 4 的倍数,且不是 100 的倍数的,为闰年(如 2004 年、2020 年等就是闰年)。
- 世纪闰年:公历年份是整百数的,必须是 400 的倍数才是闰年(如 1900 年不是闰年,2000 年是闰年)。
下面程序是判断是否是闰年的正确程序
cin >> n;
cout << ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0)) ? 1 : 0;
return 0;
根据下面的流程图,如果成绩 score 输入 60,输出的结果是( )

下面的流程图是用来求 1+2+3+⋯+10 的和。请判断:这个流程图的逻辑正确还是错误?

下面流程图的功能是计算 5 对 2 取余数,输出结果为 1。
