“计算机程序设计能力考试(乙级)”真题刷题
六、题目:1006 换个格式输出整数 (15 分)
让我们用字母 B 来表示“百”、字母 S 表示“十”,用 12…n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234 应该被输出为 BBSSS1234,因为它有 2 个“百”、3 个“十”、以及个位的 4。
输入格式:
每个测试输入包含 1 个测试用例,给出正整数 (<1000)。
输出格式:
每个测试用例的输出占一行,用规定的格式输出 n。
输入样例 1:
234
输出样例 1:
BBSSS1234
输入样例 2:
23
输出样例 2:
SS123
1.代码
#include<iostream>
#include<string.h>
using namespace std;
int main() {
int digit;
cin >> digit;
int single;
int flat = -1; //记录数:-1表示个位,0表示十位,1表示百位,2表示无关位
int count = 0; //记录result下标
char result[1000] = "0"; //存储百十位的结果
int numResult[10] = { 0 }; //存储个位的结果
while (digit > 0) {
single = digit % 10;
if (flat == -1) {
for (int i = 0; i < single; i++)
numResult[i] = i + 1;
flat = 0; //更新到十位
}
else if (flat == 0) {
for (int i = 0; i < single; i++) {
result[i] = 'S';
count++;
}
flat = 1; //更新到百位
}
else if (flat == 1) {
for (int i = 0; i < single; i++) {
result[count] = 'B';
count++;
}
}
digit = digit / 10; //更新digit
}
for (int i = strlen(result)-1; i >= 0; i--) {
if (result[i] != '0')
cout << result[i];
}//逆序输出百位十位
for (int i = 0; i < 10; i++) {
if (numResult[i] != 0) {
cout << numResult[i];
}
}//顺序输出个位
cout << endl;
system("pause");
return 0;
}
2.心得
理解好题目不难写出,其实突然发现可以用STL写更容易,*&%**(骂脏话了)…
七、题目:1007 素数对猜想 (20 分)
让我们定义d
n
为:d
n
=p
n+1
−p
n
,其中p
i
是第i个素数。显然有d
1
=1,且对于n>1有d
n
是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<10
5
),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
1.代码
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
cin >> n;///检查n以内的所有素数对
int i, j, count = 0;///count为对数
int pre = 2;///第一个素数
for (i = 3; i <= n; i++)///3~n间的素数
{
for (j = 2; j <= sqrt(i); j++)///素数判定
{
if (i % j == 0)
break;
}
if (j > sqrt(i))
{
if (i - pre == 2)
count++;
pre = i;
}
}
cout << count << endl;
system("pause");
return 0;
}
2.心得
这是平时写素数的代码带一点修改即可。
八、题目:1008 数组元素循环右移问题 (20 分)
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A
0
A
1
⋯A
N−1
)变换为(A
N−M
⋯A
N−1
A
0
A
1
⋯A
N−M−1
)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
1.代码
#include<iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
m = m % n; //因为一直在n内循环移动,有点类似循坏队列,所以对m取模
//vector<int> v,vNew(100,-1);
int v[100], vNew[100];
int num;
for (int i = 0; i < n; i++) {
cin >> num;
//v.push_back(num);
v[i] = num;
}
int mFlat = m - 1; //记录m在vNew的位置
int nFlat = n - 1; //记录n在v的位置
int temp = v[mFlat];
vNew[mFlat] = v[nFlat];
//实现关键:思路类似于快速排序,取最后的元素作为轴,放到移动m后的位置,这样数组就被分为两部分,一一补充两边即可。
for (int i = mFlat-1; i>=0; i--) {
vNew[i] = v[--nFlat];
}//将mflat之前的位置到起始的位置一一插入nFlat之前的元素
int j = 0;
for (int i = mFlat + 1; i < n; i++) {
vNew[i] = v[j];
j++;
}//将mflat之后的位置到最后的位置一一插入v起始位置的元素
//输出
cout << vNew[0];
for (int i = 1; i < n; i++) {
cout << " " << vNew[i];
}
system("pause");
return 0;
}
2.心得
学以致用,利用学过的知识迁移到题目来,结合实际情况分析。
九、题目:1009 说反话 (20 分)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80
的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1
个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
1.代码(python)
lst=[]
lst=input().split()
i=len(lst)-1
print(lst[i],end="")
while(i>0):
print(" {}".format(lst[i-1]),end="")
i=i-1
2.心得
别骂了,别骂了,因为python写真的太简洁了,嘤嘤嘤~
十、题目:1010 一元多项式求导 (25 分)
设计函数求一元多项式的导数。(注:x
n
(n为整数)的一阶导数为nx
n−1
。)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为
0 0。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
1.代码
下面的代码是柳神的,感兴趣大家点击去了解一下,代码真的简洁,膜拜大佬。
#include <iostream>
using namespace std;
int main() {
int a, b, flag = 0;
while (cin >> a >> b) {
if (b != 0) {
if (flag == 1) cout << " ";
cout << a * b << " " << b - 1;
flag = 1;
}
}
if (flag == 0) cout << "0 0";
system("pause");
return 0;
}
2.心得
向大佬看齐。。。