内容正文:
青少年软件编程(C语言)等级考试试卷(二级)
2020年9月 分数:100 题数:5
一、编程题(共5题,共100分)
1.
单词倒排
单词倒排
编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。
时间限制:10000
内存限制:65536
输入
输入为一个字符串(字符串长度至多为100)。
输出
输出为按要求排序后的字符串。
样例输入
I am a student
样例输出
student a am I
#include<iostream>
#include<string>
using namespace std;
string str;
string de[100];
int main(){
getline(cin,str);
int len=str.length();
int ind=0;
for(int i = 0;i<len;i++){
if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z'){
de[ind]+=str[i];
}else{
ind++;
de[ind]=" ";
ind++;
}
}
if(de[ind]==" "){
ind--;
}
for(int i=ind;i>=0;i--){
cout<<de[i];
}
return 0;
}
2.
细菌的繁殖与扩散
细菌的繁殖与扩散
在边长为9的正方形培养皿中,正中心位置有m个细菌。假设细菌的寿命仅一天,但每天可繁殖10个后代,而且这10个后代,有两个分布在原来的单元格中,其余的均匀分布在其四周相邻的八个单元格中。求经过n(1≤n≤4)天后,细菌在培养皿中的分布情况。
时间限制:10000
内存限制:65536
输入
输入为两个整数,第一个整数m表示中心位置细菌的个数(2 ≤ m ≤ 30),第二个整数n表示经过的天数(1 ≤ n ≤ 4)。
输出
输出九行九列整数矩阵,每行的整数之间用空格分隔。整个矩阵代表n天后细菌在培养皿上的分布情况。
样例输入
2 1
样例输出
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 2 2 2 0 0 0
0 0 0 2 4 2 0 0 0
0 0 0 2 2 2 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
#include <iostream>
#include <cstring>
#include <cstdio>
#include <stdio.h>
using namespace std;
int a[9][9]={};
int a1[9][9]={};
void virus(){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(a[i][j]!=0){
for(int k=-1;k<=1;k++){
for(int g=-1;g<=1;g++){
if(k==0&&g==0){
a1[i][j]+=a[i][j]*2;
}else{
a1[k+i][g+j]+=a[i][j];
}
}
}
}
}
}
}
int main(){
int n;
cin>>a[4][4]>>n;
for(int i=0;i<n;i++){
virus();
for(int g=0;g<9;g++){
for(int k=0;k<9;k++){
a[g][k]=a1[g][k];
a1[g][k]=0;
}
}
}
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
3.
大整数加法
大整数加法
求两个不超过200位的非负整数的和。
时间限制:1000
内存限制:65536
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char a[1001]={},b[1001]={};//输入
int a1[1001]={},b1[1001]={},c[1001]={}; //存储
cin>>a>>b;
int lena=strlen(a),lenb=strlen(b);
for(int i=0;i<lena;i++){
a1[i]=a[lena-1-i]-48;
}
for(int i=0;i<lenb;i++){
b1[i]=b[lenb-1-i]-48;
}
int maxlen=max(lena,lenb);
int lenc=0,x=0;
while(lenc<maxlen){
c[lenc]=a1[lenc]+b1[lenc]+x;
x=c[lenc]/10;
c[lenc]=c[lenc]%10;
lenc++;
}
if(x){
c[lenc]=x;
}
else{
lenc--;
}
int sum=0;
for(int i=0;i<=lenc;i++){
if(c[lenc-i]==0)sum++;
else break;
}
lenc -= sum;
for(int i=0;i<=lenc;i++){
cout<<c[lenc-i];
}
if(lenc==-1){
cout << 0;
}
return 0;
}
4.
合影效果
合影效果
小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念。如果他们站成一排,男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他们合影的效果是什么样的(所有人的身高都不同)?
时间限制:1000
内存限制:65536
输入
第一行是人数n(2 <= n <= 40,且至少有1个男生和1个女生)。 后面紧跟n行,每行输入一个人的性别(男male或女female)和身高(浮点数,单位米),两个数据之间以空格分隔。
输出
n个浮点数,模拟站好队后,拍照者眼中从左到右每个人的身高。每个浮点数需保留到小数点后2位,相邻两个数之间用单个空格隔开。
样例输入
6
male 1.72
male 1.78
female 1.61
male 1.65
female 1.70
female 1.56
样例输出
1.65 1.72 1.78 1.70 1.61 1.56
#include <bits/stdc++.h>
using namespace std;
int n;
struct stu{
bool ss;
double height;
void ini(){
string s;
cin >> s;
if(s=="male")ss=1;
else ss=0;
scanf("%lf",&height);
}
}a[41];
bool cmp(stu a1,stu b){
if(a1.ss != b.ss)
return a1.ss==1;
else if(a1.ss==1)
return a1.height<b.height;
else
return b.height<a1.height;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)a[i].ini();
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)printf("%.2lf ",a[i].height);
return 0;
}
5.
循环数
循环数
若一个n位的数字串满足下述条件,则称其是循环数(cyclic):将这个数字串视为整数(可能带有前导0),并用任意一个 1 到 n 之间(包含1和n)的整数去乘它时, 会得到一个将原数字串首尾相接后,再在某处断开而得到的新数字串所对应的整数。例如,数字 142857 是循环数,因为: 142857 *1 = 142857 142857 *2 = 285714 142857 *3 = 428571 142857 *4 = 571428 142857 *5 = 714285 142857 *6 = 857142。
请写一个程序判断给定的数是否是循环数。
注意:在此题中,输入数字串允许带前导0,且前导0不能被忽略,例如“01”是两位数字串,而“1”是一位数字串。但将数字串转化为整数做乘法运算或比较运算时,可以忽略前导0。
时间限制:10000
内存限制:65536
输入
一行,一个长度在 2 到 60 位之间的数字串。
输出
一个整数,若输入的数字串是循环数,输出1,否则输出0。
样例输入
142857
样例输出
1
#include<iostream>
#include<string>
using namespace std;
const int sz = 60;
int main(){
string str;
cin >> str;
int num[sz]={0},numt[sz*2]={0};
int str_length=str.size();
int lc=sz-str_length;
for (int f=0;f<str_length;f++){
num[sz-1-f]=str[str_length-1-f]-'0';
numt[str_length-1-f]=str[str_length-1-f]-'0';
numt[2*str_length-1-f]=str[str_length-1-f]-'0';
}
int count=1;
for (int i=2;i<=str_length;i++){
int nnum[sz]={ 0 };
for (int j=0;j<str_length;j++)
{
nnum[sz-1-j]+=num[sz-1-j]*i;
if (nnum[sz-1- j]>9){
nnum[sz-2-j]+=nnum[sz-1-j]/10;
nnum[sz-1-j]%=10;
}
}
int k = 0,count_k=0;int count_l = 0;
for (;k<str_length;k++){
if(nnum[lc]==numt[k]){
int l = 0;
for(;l<str_length;l++){
if(nnum[lc+l]!=numt[k+l])break;
}
if(l==str_length){
count_l++; break;
}
}
}
if (count_l == 1){
count++;continue;
}
}
if (count==str_length){
cout<<1<<endl;
}
else{
cout<<0<<endl;
}
return 0;
}
学科网(北京)股份有限公司
$$