您的位置:首页 > 理论基础

CCF计算机职业资格认证考试资料 部分题目答案 题库

2015-09-12 21:19 501 查看

CCF计算机职业资格认证考试资料

数据范围

类型
字节
表示范围
signed char
1
-128~+127
unsigned char
1
0~+255
short int
2
-32768~+32767
(long) int
4
-2147438648~+2141438647
long long long int
8
-9223372036854775808~+9223372036854775807


附:试题案例

问题描述
  输入A,B。
  输出A+B。
输入格式
  输入包含两个整数A,B,用一个空格分隔。
输出格式
  输出一个整数,表示A+B的值。
样例输入
  1 2
样例输出
  3
数据规模和约定
  -1,000,000,000<=A,B<=1,000,000,000。

解决此题的一个C++程序示例:

//example.cpp
#include<iostream>

using namespace std;

int main()
{
int a, b;
cin >> a >> b;
cout << a + b;
return 0;
}


问题描述

试题编号:
201503-1
试题名称:
图像旋转
时间限制:
5.0s
内存限制:
256.0MB
问题描述:
问题描述
  旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。

  计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。
输入格式
  输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。

  接下来n行每行包含m个整数,表示输入的图像。
输出格式
  输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。
样例输入
2 3

1 5 3

3 2 4
样例输出
3 4

5 2

1 3
评测用例规模与约定
  1 ≤ n, m ≤ 1,000,矩阵中的数都是不超过1000的非负整数。
//201503-1.cpp
#include<iostream>
using namespace std;
int main()
{
int m,n;
cin>>m>>n;
int s[m+1][n+1],i,j;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
cin>>s[i][j];
}
for(i=n;i>0;i--)
{
for(j=1;j<=m;j++)
cout<<s[j][i]<<" ";
cout<<endl;
}
return 0;
}


问题描述

试题编号:
201503-2
试题名称:
数字排序
时间限制:
1.0s
内存限制:
256.0MB
问题描述:
问题描述
  给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入格式
  输入的第一行包含一个整数n,表示给定数字的个数。

  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
  输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
样例输入
12

5 2 3 3 1 3 4 2 5 2 3 5
样例输出
3 4

2 3

5 3

1 1

4 1
评测用例规模与约定
  1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。
//201503-2.cpp
#include<iostream>
using namespace std;
int main()
{
int n,t,i,j,max,s[1001],k[1001];
cin>>n;
for(i=1;i<1001;i++)
s[i]=0;
for(i=0;i<n;i++)
{
cin>>t;
s[t]++;
if(t>max)
max=t;
}
for(i=1;i<=max;i++)
{
k[i]=i;
}
for(i=1;i<max;i++)
{
for(j=i+1;j<=max;j++)
{
if(s[k[j]]>s[k[i]])
{
t=k[j];
k[j]=k[i];
k[i]=t;
}
if(s[k[j]]==s[k[i]]&&k[j]<k[i])
{
t=k[j];
k[j]=k[i];
k[i]=t;
}
}
}
for(i=1;i<=max;i++)
{
if(s[k[i]]!=0)
cout<<k[i]<<""<<s[k[i]]<<endl;
}
return 0;
}


问题描述

试题编号:
201503-3
试题名称:
节日
时间限制:
1.0s
内存限制:
256.0MB
问题描述:
问题描述
  有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日。

  现在,给你a,b,c和y1, y2(1850 ≤ y1, y2 ≤ 2050),希望你输出从公元y1年到公元y2年间的每年的a月的第b个星期c的日期。

  提示:关于闰年的规则:年份是400的整数倍时是闰年,否则年份是4的倍数并且不是100的倍数时是闰年,其他年份都不是闰年。例如1900年就不是闰年,而2000年是闰年。

  为了方便你推算,已知1850年1月1日是星期二。
输入格式
  输入包含恰好一行,有五个整数a, b, c, y1, y2。其中c=1, 2, ……, 6, 7分别表示星期一、二、……、六、日。
输出格式
  对于y1和y2之间的每一个年份,包括y1和y2,按照年份从小到大的顺序输出一行。

  如果该年的a月第b个星期c确实存在,则以"yyyy/mm/dd"的格式输出,即输出四位数的年份,两位数的月份,两位数的日期,中间用斜杠“/”分隔,位数不足时前补零。

  如果该年的a月第b个星期c并不存在,则输出"none"(不包含双引号)。
样例输入
5 2 7 2014 2015
样例输出
2014/05/11

2015/05/10
评测用例规模与约定
  所有评测用例都满足:1 ≤ a ≤ 12,1 ≤ b ≤ 5,1 ≤ c ≤ 7,1850 ≤ y1, y2 ≤ 2050。
//201503-3.cpp
#include<iostream>
#include <cstdio>//printf库
#include<algorithm>//max,min库
using namespace std;
intday[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}
,{0,31,29,31,30,31,30,31,31,30,31,30,31}};
/*  1 2  3  4  5  6 7  8  9  1011 12 */
bool isRunNian(int y)
{
if(y%400==0)return true;
if(y%4==0 && y%100!=0)return true;
return false;
}
int main()
{
int a,b,c,d,e,y1,y2,i,j,k;
cin>>a>>b>>c>>d>>e;
y1=min(d,e);
y2=max(d,e);
d=1;
for(i=1850;i<y1;i++)
{
if(isRunNian(i))
d+=366;
else
d+=365;
}
c%=7;
d%=7;
for(i=y1;i<=y2;i++)
{
for(j=1;j<=12;j++)
{
if(j==a)
{
k=(b-1)*7+1;
while((d+k)%7!=c)
{
k++;
}
if(k>day[isRunNian(i)][j])
cout<<"none"<<endl;
else
printf("%d/%02d/%02d\n",i,j,k);
}
d+=day[isRunNian(i)][j];
d%=7;
}
}
return 0;
}


问题描述

试题编号:
201412-1
试题名称:
门禁系统
时间限制:
1.0s
内存限制:
256.0MB
问题描述:
问题描述
  涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现。
输入格式
  输入的第一行包含一个整数n,表示涛涛的记录条数。

  第二行包含n个整数,依次表示涛涛的记录中每位读者的编号。
输出格式
  输出一行,包含n个整数,由空格分隔,依次表示每条记录中的读者编号是第几次出现。
样例输入
5

1 2 1 1 3
样例输出
1 1 2 3 1
评测用例规模与约定
  1≤n≤1,000,读者的编号为不超过n的正整数。
//201412-1.cpp
#include<iostream>
using namespace std;
int main()
{
int n,i,j;
cin>>n;
int s[n+1];
for(i=1;i<=n;i++)
{
cin>>s[i];
}
for(i=1;i<=n;i++)
{
s[0]=0;
for(j=i;j>0;j--)
if(s[j]==s[i])
s[0]++;
cout<<s[0]<<" ";
}
cout<<endl;
return 0;
}


问题描述

试题编号:
201412-2
试题名称:
Z字形扫描
时间限制:
2.0s
内存限制:
256.0MB
问题描述:
问题描述
  在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:



  对于下面的4×4的矩阵,

  1 5 3 9

  3 7 5 6

  9 4 6 4

  7 3 1 3

  对其进行Z字形扫描后得到长度为16的序列:

  1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3

  请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。

输入格式
  输入的第一行包含一个整数n,表示矩阵的大小。

  输入的第二行到第n+1行每行包含n个正整数,由空格分隔,表示给定的矩阵。
输出格式
  输出一行,包含n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。
样例输入
4

1 5 3 9

3 7 5 6

9 4 6 4

7 3 1 3
样例输出
1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
评测用例规模与约定
  1≤n≤500,矩阵元素为不超过1000的正整数。
//201412-2.cpp
#include<iostream>
using namespace std;
int main()
{
int n,i,j,k;
cin>>n;
int s[n+1][n+1];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>s[i][j];
}
}
i=1;
j=1;
bool flg=true;
for(k=2;k<=2*n;k++)
{
if(flg)
{
while(i && j<=n)
{
cout<<s[i][j]<<" ";
j++;
i=k-j;
}
flg=false;
if(j>n)
{
j--;
i+=2;
}
else
{
i=1;
}
}
else
{
while(j && i<=n)
{
cout<<s[i][j]<<" ";
i++;
j=k-i;
}
flg=true;
if(i>n)
{
i--;
j+=2;
}
else
{
j=1;
}
}
}
return 0;
}


问题描述

试题编号:
201409-1
试题名称:
相邻数对
时间限制:
1.0s
内存限制:
256.0MB
问题描述:
问题描述
  给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。
输入格式
  输入的第一行包含一个整数n,表示给定整数的个数。

  第二行包含所给定的n个整数。
输出格式
  输出一个整数,表示值正好相差1的数对的个数。
样例输入
6

10 2 6 3 7 8
样例输出
3
样例说明
  值正好相差1的数对包括(2, 3), (6, 7), (7, 8)。
评测用例规模与约定
  1<=n<=1000,给定的整数为不超过10000的非负整数。
//201409-1.cpp
#include<iostream>
using namespace std;
int main()
{
intn,i,j,temp;
cin>>n;
ints[n+1];
i=n;
while(i)
{
cin>>s[i];
i--;
}
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(s[j]<s[i])
{
temp=s[j];
s[j]=s[i];
s[i]=temp;
}
}
//cout<<s[i]<<endl;
}
temp=0;
for(i=1;i<n;i++)
{
if(s[i+1]-s[i]==1)
temp++;
}
cout<<temp;
return 0;
}


问题描述

试题编号:
201409-2
试题名称:
画图
时间限制:
1.0s
内存限制:
256.0MB
问题描述:
问题描述
  在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。

  下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。



  给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。

输入格式
  输入的第一行包含一个整数n,表示要画的矩形的个数。

  接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。
输出格式
  输出一个整数,表示有多少个单位的面积被涂上颜色。
样例输入
2

1 1 4 4

2 3 6 5
样例输出
15
评测用例规模与约定
  1<=n<=100,0<=横坐标、纵坐标<=100。
//201409-2.cpp
#include<iostream>
#include <algorithm>
using namespace std;
int main()
{
intn,i,j,k,minX=100,maxX=0,minY=100,maxY=0;
cin>>n;
ints[4][n+1];
i=n;
while(i)
{
cin>>s[0][i]>>s[1][i]>>s[2][i]>>s[3][i];
minX=min(minX,s[0][i]);
minY=min(minY,s[1][i]);
maxX=max(maxX,s[2][i]);
maxY=max(maxY,s[3][i]);
i--;
}
//cout<<minX<<""<<maxX<<endl<<minY<<""<<maxY<<endl;
s[0][0]=0;
boolflg;
for(i=minX+1;i<=maxX;i++)
{
for(j=minY+1;j<=maxY;j++)
{
flg=false;
for(k=1;k<=n;k++)
{
if(i>s[0][k]&& i<=s[2][k] && j>s[1][k] && j<=s[3][k])
flg=true;
}
if(flg)
s[0][0]++;
}

}
cout<<s[0][0];
return0;
}


问题描述

试题编号:
201312-1
试题名称:
出现次数最多的数
时间限制:
1.0s
内存限制:
256.0MB
问题描述:
问题描述
  给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。
输入格式
  输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。

  输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。
输出格式
  输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。
样例输入
6

10 1 10 20 30 20
样例输出
10
//201312-1.cpp
#include<iostream>
using namespace std;
int main()
{
intn,i,j,temp;
cin>>n;
ints[n+1],t
;
i=n;
while(i)
{
cin>>s[i];
i--;
}
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(s[j]<s[i])
{
temp=s[j];
s[j]=s[i];
s[i]=temp;
}
}
}
for(i=1;i<n;i++)
{
j=1;
while(s[i+j]==s[i]&&i+j<=n)
{
j++;
}
t[i]=j;
}
temp=1;
for(i=1;i<n;i++)
{
if(t[i]>t[temp])
temp=i;
}
cout<<s[temp];
return 0;
}


问题描述

试题编号:
201312-2
试题名称:
ISBN号码
时间限制:
1.0s
内存限制:
256.0MB
问题描述:
问题描述
  每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。

  识别码的计算方法如下:

  首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。

  编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出是正确的ISBN号码。
输入格式
  输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出格式
  输出一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。
样例输入
0-670-82162-4
样例输出
Right
样例输入
0-670-82162-0
样例输出
0-670-82162-4
//201312-2.cpp
#include<iostream>

using namespace std;

int main()
{
char s[14],k;
cin >> s;
k=(s[0]*1+s[2]*2+s[3]*3+s[4]*4+s[6]*5+s[7]*6+s[8]*7+s[9]*8+s[10]*9-2160)%11+48;
if(k==s[12] || (s[12]-k)==30 )
cout<<"Right";
else
{
if(k==58)
k=88;
s[12]=k;
cout<<s;
}
return 0;
}


问题描述

试题编号:
201312-3
试题名称:
最大的矩形
时间限制:
1.0s
内存限制:
256.0MB
问题描述:
问题描述
  在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。



  请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。



输入格式
  第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。

  第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。
输出格式
  输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
样例输入
6

3 1 6 5 2 3
样例输出
10
//201312-3.cpp
#include<iostream>

using namespace std;

int main()
{
intn,i,j,k,max=0,min;
cin>>n;
ints[n+1],t[n+1];
i=n;
while(i)
{
cin>>s[i];
i--;
}
max=0;
for(k=1;k<=n;k++)
{
for(i=1;i<=n+1-k;i++)
{
t[i]=0;
min=s[i];
for(j=1;j<=k;j++)
{
if(s[i-1+j]<min)
min=s[i-1+j];
}
if(max<k*min)
max=k*min;
}
}
cout<<max;
return0;
}


问题描述

试题编号:
201403-1
试题名称:
相反数
时间限制:
1.0s
内存限制:
256.0MB
问题描述:
问题描述
  有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。
输入格式
  第一行包含一个正整数 N。(1 ≤ N ≤ 500)。

  第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。
输出格式
  只输出一个整数,即这 N 个数中包含多少对相反数。
样例输入
5

1 2 3 -1 -2
样例输出
2
//201403-1.cpp
#include<iostream>
using namespace std;
int main()
{
intn,i,j,count=0;
cin>>n;
ints[n+1];
i=n;
while(i)
{
cin>>s[i];
i--;
}
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if((s[i]+s[j])==0)
count++;
}
}
cout<<count<<endl;
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: