做题的大致步骤为:
读题→分析(确定考点与算法)→编程→提交→判题结果(修改→再提交)
解题包含的三个重要的点为:
代码框架 →算法思路→ 输入输出套路
基本上用到while for if…else 这几个嵌套使用
解题最难的一部分是根据题目找到合适的解题方法并编写成对应的程序,运行出结果,这一部分要具体问题具体分析。
但除了算法问题,一道题目程序的编写都有固定的框架与套路。
1、解题代码框架
一般院校上机都支持C/C++,也有的院校支持Java和python,这里以C/C++的代码举例。编译器使用的是Dev-C++。
在解题时首先编写的就是程序的框架,一般C/C++都要有头文件,如:
#include<stdio.h> //C
int main(){
...
return 0;
}
include<iostream> //C++
using namesapce std;
int main(){
...
return 0;
}
头文件的引入可以简单理解为在头文件中有你编程所需要的各种函数,如果你不引用就无法使用这个函数,如C++里面的cin/cout就需要引入关于输入输出的函数,如使用开平方函数就要引入cmath这个头文件,
另外C语言中的头文件一般是.h格式,在C++中只需要将.h 删除换成c开头就能用
#include<math.h> → #include<cmath>
std是C++里的一个bai名字空间,用using namespace, 命令将duSTD里面的所有标识都包含到源程序中,就和声明普通变量一样,STD里的标识的作用域就是从声明处开始到离开该过程结束。
另外你也可以不用这个语句,在使用标识符前,在前面加上std::即可,比如:std::cout<<…;
为了减轻记忆压力,只需要记一种风格的框架即可,这里推荐记C++风格的,因为C++向下兼容C语法,而且,C++中有个万能头文件
#include<bits/stdc++.h> //包含了目前c++所包含的所有头文件!!!!
在程序开头写上这个头文件,就不用再记或再写其他头文件的名字了。
其他要注意的点是哪些地方要加分号,那些不要加(注意要是半角分号)。
除了这个固定的框架,剩下的就是输入输出的套路了。
所有的考题都涉及到输入输出,这个时候的考点是输入的形式与输出的形式如何实现。
2、输入的套路与对应的解题方法
输入数据一般分为一组数据和多组数据。一般有如下三种输入方式:
1、多组输入,未知组数:
一般题目的描述都是输入数据有多组,每组占用一行;
double x[2], y[2];
while (scanf("%lf%lf%lf%lf", x, y, x+1, y+1) != EOF)
在scanf的外面用while循环,EOF意思是END OF FILE(文件末尾),OJ系统中的测试样例是以文件的方式存储的,也就是测试的数据都存放在文件中,文件末尾会有结束标志,系统会根据你的程序将文件中的数据依次读入系统进行测试,直到读到这个文件的末尾才算测试结束。
scanf可以实现多组数据输入,这个!=EOF要学会使用;
#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>
//#include<bits/stdc++.h> /*注意这里也可以用我们之前说的万能头文件,
这样只需一行即可替换上面所有头文件*/
using namespace std;
int main(){
char a,b,c;
char x[3];
while(scanf("%c%c%c",&a,&b,&c)!=EOF){
getchar();//这里是要把'\n'取掉,不然输出会出错
x[0] = a;
x[1] = b;
x[2] = c;
sort(x,x+3);
printf("%c %c %c\n",x[0],x[1],x[2]);
}
return 0;
}
除了上面用C中scanf输入,也可以用C++中的cin来实现多组输入
#include <iostream>
#include <algorithm>
using namespace std;
int main(void)
{
char n[4];
while (cin >> n) //cin
{
if (n[0] > n[1]) swap(n[0], n[1]);
if (n[1] > n[2]) swap(n[1], n[2]);
if (n[0] > n[1]) swap(n[0], n[1]);
cout << n[0] << ' ' << n[1] << ' ' << n[2] << endl;
}
return 0;
}
这里要注意cin输入是不识别空格的,每一组数据用空格隔开就可以实现多组输入。
2、多组输入,指定组数:开始的时候让你输入一个代表输入数据第一行包含一个数n,接下有n行,每行一个实例
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);//输入n,表示有t组测试数据
while(n--)//n自减为0,执行结束
{
/*这里正常写代码*/
}
return 0;
}
也有的是让输入多组数据,每一组的数据的数量是确定的,比如下面这一题
#include <stdio.h>
int main(void)
{
int n, i, s, t;
while (scanf("%d", &n) != EOF) //n是每组的数据个数
{
for (s = 1, i = 0 ; i < n ; i++) //依次输入n个数
{
scanf("%d", &t);
if (t & 1) s *= t;//是奇数就乘一次,&是按位运算(二进制)
}
printf("%d\n", s);
}
return 0;
}
3、多组输入,指定跳出:比如要求输入到 0 0 的时候跳出
int a,b;
while(scanf(”%d %d”,&a,&b) != EOF){
if(a==0 && b==0){
break;
}
Printf(“%d\n”,a+b);
}
注:输入的时候使用gets是可以读取空格的,scanf不能读入空格
3、输出的套路与解题方法
输出数据的考点一般是考察输出格式,比较常见的题目是要每组数据输出一行,也就是要要换行输出,这种只需在输出语句的后面加"\n"即可,这种题目有的还会有下面几种要求:
另外一种更复杂一点的输出格式是要求输出的时候第一个字母之前无空格,之后有空格,且最后一个字符是回车:
for(int i=0;i<n;i++)
printf("%d%c", a[i], (i < n - 1 ? ' ' : '\n')); //最后一次循环不满足判断条件,输出换行符
如 输入整数n = 12345,输出5 4 3 2 1;
另外关于ASCII码的相关题目的一点补充:
除了上面这些输出输出的方法,有时使用cin、cout也能实现。暂时记这么多吧。