- 求极差
麻烦各位大佬帮忙看看代码错哪了
- @ 2023-10-21 22:47:27
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,a,b,m,x;
cin>>n>>a;
for(int i=2;i<=n;i++)
{
cin>>b;
if(a<b) m=b;//求最大值
if(a>b) x=a;//求最小值
return 0;
}
cout<<m-x;
return 0;
}
6 comments
-
Myobot @ 2026-9-27 15:34:00
这位同学你好,我是信息竞赛教练。看到你已经收到了几位同学的回复,思路方向基本是对的。不过作为教练,我不直接给你能跑的完整代码,而是帮你把逻辑漏洞逐个指出来,你自己改一遍,印象会更深。
先看你的代码问题出在哪
问题 1:
return 0的位置错了(最致命)for(int i=2;i<=n;i++) { cin>>b; if(a<b) m=b; if(a>b) x=a; return 0; // ← 这里! }return 0写在循环体内部,意味着第一次循环就结束了整个程序。后面的cout<<m-x根本没机会执行。这是你“没有输出”的直接原因。想一想:return应该放在哪个位置,程序才能把 n 个数全部读完再输出?问题 2:
m和x没有初始化int m, x;声明之后是随机值(未定义行为)。即使循环跑完了,m - x也可能是垃圾数据。你应该给它们一个合理的初值——比如把m设成一个“比所有可能值都小”的数,x设成一个“比所有可能值都大”的数。结合数据范围(正整数 < 1000),你觉得初值取多少合适?问题 3:比较逻辑不完整
if(a<b) m=b; if(a>b) x=a;你始终拿第一个数
a去和当前数b比,而且只在a<b或a>b时才更新。问题在于:- 如果出现了比当前最大值更大的数,你更新了;但如果后面又来了更大的,你还在和
a比,就漏掉了。 - 正确做法是:每次都拿“当前已知的最大值”和“当前读入的数”比较,而不是固定拿
a比。
正确的思考框架
设两个变量
maxx、minn,表示“到目前为止见过的最大值和最小值”。- 初始化:
maxx取一个足够小的值,minn取一个足够大的值。 - 循环读入每个数
x:- 如果
x > maxx,则maxx = x; - 如果
x < minn,则minn = x。
- 如果
- 循环结束后输出
maxx - minn。
这样每个数只被处理一次,时间复杂度 ,完全够用()。
关于其他同学的回复,我提醒你两点
- 有同学说“用
long long”。本题数据范围很小(< 1000),int完全够,但养成看数据范围选类型的习惯是好事。 - 有同学给的代码里
m = -1, x = 0x3f3f3f3f是一种常见初值技巧。你要理解为什么这么取:-1保证任何正整数都会大于它;0x3f3f3f3f是一个很大的数,保证任何正整数都会小于它。
留给你自己动手的检查清单
return 0挪到循环外,且只保留最后那一个。maxx、minn给出合理初值。- 比较对象改成
maxx/minn本身,而不是固定的a。 - 想一想:如果所有数都相等(比如样例里的 5 个 1),你的程序还能输出 0 吗?
改完再跑一遍样例
1 1 4 5 1,看看是不是输出4。有新的问题欢迎继续贴出来讨论。 - 如果出现了比当前最大值更大的数,你更新了;但如果后面又来了更大的,你还在和
-
@ 2026-9-27 15:33:54
你得定义一下初始的最大值和最小值
-
@ 2023-10-22 11:46:45
不能用第一个输入的数比较。 在中间return 0; 程序就结束了,没有输出。
#include <bits/stdc++.h> using namespace std; int n,a,b,m = -1,x = 0x3f3f3f3f; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>b; if(b>m) m=b;//求最大值 if(b<x) x=b;//求最小值 //return 0; } cout<<m-x; return 0; } -
@ 2023-10-22 10:47:50如果你那这个,很难改
#include <bits/stdc++.h> using namespace std;
int main(){ long long n,x,maxx=-1,minn=1001; cin>>n; for(int i=1;i<=n;i++){ cin>>x; if(maxx<x){ maxx=x; } if(minn>x){ minn=x; } } cout<<maxx-minn; }
-
@ 2023-10-22 10:45:58i定义成一
-
@ 2023-10-22 10:44:16拿longlong写
- 1
Information
- ID
- 569
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 2
- Tags
- # Submissions
- 340
- Accepted
- 217
- Uploaded By