使用long类型求三个整数第二大数时输出错误的原因是什么?
问题分析与解决
嘿,我来帮你揪出这个问题的根源!你遇到的情况是典型的格式说明符与变量类型不匹配导致的未定义行为,这也是很多刚接触算法竞赛的新手容易踩的坑。
为什么int正常,换成long就出错?
- 当变量是
int类型时,scanf("%i")和printf("%i")刚好对应int的内存读写规则,字节数匹配,所以输入输出都能正常工作。 - 但换成
long类型后,%i依然是按照int的字节长度来处理数据(比如64位系统下int是4字节,long是8字节),这就导致数据在读取和输出时被错误解析,自然得到了错误的结果。
两种修正方案
方案1:匹配long类型的格式说明符
把scanf和printf里的%i替换为%ld(这是C标准中对应long类型的格式符),代码修改后如下:
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin >>n ; while(n--){ long a,b,c,d; scanf("%ld%ld%ld",&a,&b,&c); // 替换为long对应的格式符 d=min(max(a,b),max(a,c)); printf("%ld\n",d); // 同样替换格式符 } return 0; }
方案2:用cin/cout简化操作(更适合竞赛新手)
既然你已经包含了万能头bits/stdc++.h,直接用cin和cout会更省心——它们会自动适配变量的类型,完全不用纠结格式符的问题:
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin >>n ; while(n--){ long a,b,c,d; cin >> a >> b >> c; d=min(max(a,b),max(a,c)); cout << d << endl; } return 0; }
另外要夸一句:你计算三个数中第二大数的逻辑是完全正确的,min(max(a,b), max(a,c))这个写法很巧妙,没问题~
内容的提问来源于stack exchange,提问作者Suyash Srivastava




