对于初学者来说,OJ平台的编程题目往往是学习路上的第一道门槛。河工计院的这50道基础题目涵盖了从输入输出、分支循环到数学运算、逻辑判断等核心编程概念。下面我将结合自己多年的编程经验,带大家逐一攻克这些题目。
1001题a+b是每个编程初学者的第一课。这道题目教会我们最基本的输入输出操作:
cpp复制#include <iostream>
using namespace std;
int main() {
int a,b;
cin>>a>>b;
cout<<a+b;
return 0;
}
很多同学在这里容易犯的错误是忘记包含iostream头文件,或者混淆了cin/cout的箭头方向。记住:cin的箭头总是朝向变量,cout的箭头总是朝向输出内容。
1003题求圆的面积引入了浮点数运算和常量定义:
cpp复制#include <iostream>
#include <iomanip>
const double PI = 3.14;
using namespace std;
int main() {
double r;
cin>>r;
cout<<setiosflags(ios::fixed)<<setprecision(4)<<PI*r*r;
return 0;
}
这里有几个关键点:
1021题要求判断一个数是正数、负数还是零:
cpp复制#include <iostream>
using namespace std;
int main() {
int n;
cin>>n;
if(n == 0) cout<<"zero";
else if(n > 0) cout<<"positive";
else cout<<"negative";
return 0;
}
这个简单的题目考察了if-else语句的基本用法。在实际编程中,我建议总是用大括号明确代码块范围,即使只有一行代码,这样可以避免很多潜在错误。
1050题要求用while循环计算正整数位数:
cpp复制#include <iostream>
using namespace std;
int main() {
int n;
cin>>n;
int ans = 0;
while(n > 0) {
n /= 10;
ans++;
}
cout<<ans;
return 0;
}
这里展示了while循环的典型用法。我经常看到新手犯的一个错误是忘记改变循环条件(如n/=10),导致无限循环。记住:while循环必须确保条件能在有限步骤内变为假。
1014题鸡兔同笼是一个经典问题:
cpp复制#include <iostream>
using namespace std;
int main() {
int n,m;
cin>>n>>m;
int rab = (m - 2 * n) / 2;
int chi = n - rab;
cout<<chi<<" "<<rab;
return 0;
}
这道题考察的是二元一次方程的解法。在实际编程中,我们需要注意整数除法的特性,确保不会因为截断导致错误结果。
1043题质数判断展示了基础算法实现:
cpp复制#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
cin>>n;
if(n == 1) {
cout<<"No";
return 0;
}
int flag = 1;
for(int i = 2; i <= sqrt(n); i++) {
if(n % i == 0) {
flag = 0;
break;
}
}
cout<<(flag?"Yes":"No");
return 0;
}
这里有几个优化点:
1012题三个整数的和展示了数据类型的重要性:
cpp复制#include <iostream>
using namespace std;
typedef long long ll;
int main() {
ll a,b,c;
cin>>a>>b>>c;
cout<<a+b+c;
return 0;
}
当处理大数时,int类型可能溢出,这时需要使用long long。这是新手常犯的错误之一,我建议在不确定数据范围时,默认使用long long更安全。
1003题求圆的面积中,我们使用了setprecision来控制输出精度:
cpp复制cout<<setiosflags(ios::fixed)<<setprecision(4)<<PI*r*r;
浮点数运算中,精度问题经常导致意想不到的结果。建议:
1041题多用例测试展示了如何处理多组输入:
cpp复制#include <iostream>
using namespace std;
int main() {
int a,b;
while(cin>>a>>b) {
cout<<a+b<<endl;
}
return 0;
}
这种写法在OJ系统中很常见。记住:测试数据通常以EOF结束,while(cin>>a>>b)能自动处理这种情况。
1044题要求计算一个复杂数列的前n项和:
cpp复制#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n;
cin>>n;
double sum = 0;
int flag = 1;
for(int i = 1; i <= n; i++) {
double item = (i * 1.0) / (2 * i - 1) * flag;
sum += item;
flag = -flag;
}
cout<<fixed<<setprecision(3)<<sum;
return 0;
}
这类题目考察的是数学公式的编程实现能力。关键在于:
1047题百文买百鸡是经典的穷举问题:
cpp复制#include <iostream>
using namespace std;
int main() {
int m;
cin>>m;
for(int i = 0; i <= m/5; i++) {
for(int j = 0; j <= m/3; j++) {
int k = m - i - j;
if(i*15 + j*9 + k == m*3) {
cout<<i<<" "<<j<<" "<<k;
return 0;
}
}
}
cout<<"No answer";
return 0;
}
穷举法的要点:
在实际编程中,我经常使用这类题目来训练算法思维。虽然现代计算机运算速度很快,但好的算法设计仍然能显著提高程序效率。
通过这50道题目的系统练习,相信你已经掌握了C++编程的基础知识。编程能力的提升没有捷径,只有不断练习、思考和总结。建议你在完成这些题目后,尝试自己设计一些类似的题目,或者去更高级的OJ平台挑战更复杂的问题。记住,每个优秀的程序员都是从"a+b"开始的。