阅读程序题是得分的关键,因为不是让你上机去运行程序,所以要一步步地读程序,记录相关变量值的变化情况。因为程序的运行结果只有输出语句才有输出,所以只写出输出语句的结果。有时要找出规律才能写出结果,特别是循环次数多的情况,另外要注意边界值,不能多算一步也不能少算一步。
解决这类问题的关键在于能够分析程序的结构以及程序段的功能。常见的有列表法、画流程图法等。完成这类题目的方法和步骤如下:
1、从头到尾通读程序,大致把握程序的算法、找出这个题目的即这个程序想干什么。抓住了它,不仅得出答案变得较容易,而且对自己的结果也会比较有信心。
2、通过给程序分段、理清程序的结构和层次,达到读懂程序的目的。
3、阅读程序中特别注意跟踪主要变量的值的变化,可以用列表的方法,了解变量变化和程序的运行结果,注意发现规律。所谓列表法,就是将各变量名作为表头,在程序的执行过程中,将各变量值的变化记录在相应变量的下方。
4、按照程序中输出格式的要求,写出运行结果,并带着结果回到程序进行检查。
在阅读程序时,要特别注意过程、函数所完成的子任务以及和主程序之间的参数传递关系。在阅读程序中,比较好的方法是首先阅读主程序,看其需要调用的过程或函数是什么,最后要求输出变量是什么;其次在阅读程序中,将较长的程序分成几个程序段(特别注意循环结构、判断结构),阅读理解各程序段的功能以及各程序之间的关联。
NOIP2011-1.
#include
using namespace std;
int main()
{
int i,n,m,ans;
cin>>n>>m;
i=n;
ans=0;
while(i<=m){
//从i=10~20,共循环计数11次
ans+=i;
//每次循环,ans累加一次 i 值
i++;
}
cout<<><>< span=""><><>
//此时ans值应为(10+20)*11/2,即165
return 0;
}
输入: 10 20
输出: 165
NOIP2011-2.
#include
#include
using namespace std;
int main()
{
string map= '2223334445556667778889999';
//数组中元素位置是从0开始计数的
string tel;
int i;
cin>>tel;
for(i=0;i
if((tel[i]>='0') && (tel[i]<='9') )
//如果输入的tel是0~9,直接输出tel值
cout<<>< span=""><>
else if( (tel[i]>='A') && (tel[i]<='Z'))
cout<<="" span="">="">
//如果输入的tel是A~Z,则输出一个map数组中对应的元素
//输出元素在map数组中位置为“输入字母与A的ASCII码的差值”
//如果输入的是其他字符,比如“-”,则不符合循环条件,无输出
cout<<>< span=""><>
return 0;
}
输入: CCF-NOIP-2011
输出: 22366472011
NOIP2011-3.
#include
#include
using namespace std;
const int SIZE= 100;
int main()
{
int n,i,sum,x,a[SIZE];
cin>>n;
memset(a,0,sizeof(a));
for(i=1;i<=n;i++){
cin>>x;
a[x]++;
}
//循环结束时数组中的值为:a[1]=1,a[2]=2,a[3]=3,a[4]=2,a[5]=1,a[6]=2
i=0;
sum=0;
while(sum<(n/2+1)){
//当sum值大于等于n/2+1,即sum>=6的时候,循环结束
i++;
sum+=a[i];
}
cout<<><>< span=""><><>
//输出循环结束时 i 的值(不是sum的值)
return 0;
}
输入:
11
4 5 6 6 4 3 32 3 2 1
输出: 3
NOIP2011-4.
#include
using namespace std;
int solve(int n,int m)
{
int i,sum;
if(m==1) return 1;
//递归函数solve(i,m)中m=1时返回函数值为1
sum=0;
for(i=1;i
//递归函数solve(i,m)中i=1时不循环,sum=0
sum+= solve(i,m-1);
return sum;
//可递归求得sum=solve(1,3)+(2,3)+(3,3)+(4,3)+(5,3)+(6,3)
}
int main()
{
int n,m;
cin>>n>>m;
cout<<><>< span=""><><>
//输出函数值,即sum值
return 0;
}
输入: 7 4
输出: 20
NOIP2012-1.
#include
using namespace std;
int a, b, c, d, e, ans;
int main()
{
cin>>a>>b>>c;
d = a+b;
e = b+c;
ans = d+e;
//ans=a+b+b+c
cout<<><>< span=""><><>
return 0;
}
输入: 1 2 5
输出: 10
NOIP2012-2.
#include
using namespace std;
int n, i, ans;
int main()
{
cin>>n;
ans = 0;
for (i = 1; i <= n; i++)
if (n % i == 0)
ans++;
//统计1~18中18的因数个数
cout<<><>< span=""><><>
return 0;
}
输入: 18
输出: 6
NOIP2012-3.
#include
using namespace std;
int n, i, j,a[100][100];
int solve(int x,int y)
{
int u, v;
if(x == n)
return a[x][y];
//递归边界:当x=5时,solve(5,y)=a[5][y]
u= solve(x + 1, y);
v= solve(x + 1, y + 1);
if(u > v)
return a[x][y] + u;
else
return a[x][y] + v;
//用递归最终求得solve(1,1)=a[1][1]+solve(2,2)=2+12=14
}
int main()
{
cin>>n;
for(i = 1; i <= n; i++)
for (j = 1; j <= i; j++)
cin>>a[i][j];
cout<<><>< span=""><><>
return 0;
}
输入:
5
2
-1 4
2 -1 -2
-1 6 4 0
3 2 -1 5 8
输出: 14
NOIP2012-4.
#include
#include
using namespace std;
int n, ans, i, j;
string s;
char get(int i)
{
if(i < n)
return s[i];
else
return s[i-n];
//i<8时,get(i)返回s[i];i>=8时,get(i)返回s[i-8],从第一个开始返回
}
int main()
{
cin>>s;
n= s.size();
ans= 0;
for(i = 1; i <= n-1; i++)
{
for (j = 0; j <= n-1; j++)
if (get(i+j) < get(ans+j))
{
ans = i;
break;
}
else if (get(i+j) > get(ans+j))
break;
}
//此循环执行完毕,ans=7
for(j = 0; j <= n-1; j++)
cout<<>< span=""><>
//1,ans+j<8,输出s[7+0];2,ans+j=8,输出s[8-8];3,ans+j=9,输出s[9-8]……
cout<<>< span=""><>
return 0;
}
输入: CBBADADA
输出: ACBBADAD
NOIP2013-1.
#include
using namespace std;
int main()
{
inta, b;
cin>>a>>b;
cout<<><><><><><>< span=""><><><><><><>
return 0;
}
//输出:3+5=8
输入: 3 5
输出: 3+5=8
NOIP2013-2.
#include
using namespace std;
int main()
{
int a, b, u, i, num;
cin>>a>>b>>u;
num = 0;
for (i = a; i <= b; i++)
if ((i % u) == 0)
num++;
//1-100之间有多少数是15的倍数
cout<<><>< span=""><><>
return 0;
}
输入: 1 100 15
输出: 6
NOIP2013-3.
#include
using namespace std;
int main()
{
const int SIZE = 100;
int n, f, i, left, right, middle, a[SIZE];
cin>>n>>f;
for (i = 1; i <= n; i++)
cin>>a[i];
left = 1;
right = n;
do {
middle= (left + right) / 2;
if(f <= a[middle])
right = middle;
else
left = middle + 1;
}while (left < right);
// middle=6,17>a[6],则left=7
// middle=9,17<>< span="">,则right=9<>
// middle=8,17<>< span="">,则right=8<>
// middle=7,17=a[7],则right=7
// left=right,直接输出left
cout<<><>< span=""><><>
return 0;
}
输入:
12 17
2 4 6 9 11 15 1718 19 20 21 25
输出: 7
NOIP2013-4.
#include
using namespace std;
int main()
{
constint SIZE = 100;
intheight[SIZE], num[SIZE], n, ans;
cin>>n;
for(int i = 0; i < n; i++) {
cin>>height[i];
num[i] = 1;
for (int j = 0; j < i; j++) {
if ((height[j] < height[i]) && (num[j] >= num[i]))
num[i] = num[j]+1;
}
}
//两两相比,得出num[0], num[1], num[2], num[3], num[4], num[5]
ans= 0;
for(int i = 0; i < n; i++) {
if (num[i] > ans) ans = num[i];
}
//得出num中最大值,即在数组height中第几位数值最大
cout<<><>< span=""><><>
return 0;
}
输入:
6
2 5 3 11 12 4
输出: 4
联系客服