2023年12月青少年软件编程等级考试(C语言)一级试卷及C语言版答案

  1. 数的输入和输出
    (同2021年6月第1题)
  2. 计算分数的浮点数值
    (同2019年12月第2题)
  3. 数字判断
    (同2021年9月第3题)
  4. 统计数
    (同2021年12月第4题)
  5. 硬币翻转
    (同2021年6月第5题)

1.数的输入和输出

输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。

输入
一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。
输出
一行两个数,分别为保留2位小数输出的F,以及整数N,以一个空格分开。
样例输入
100 123.456789
样例输出
123.46 100
参考范例

#include <stdio.h>
int main() 
{
    int N;
    double F;   
    scanf("%d",&N);
    scanf("%lf",&F);
	printf("%.2lf ",F);
	printf("%d ",N);
    return 0;
}

2. 计算分数的浮点数值

两个整数a和b分别作为分子和分母,既分数 a/b ,求它的浮点数值(双精度浮点数,保留小数点后9位)

输入
仅一行,包括两个整数a和b(b不为0)
输出
也仅一行,分数 a/b 的浮点数值(双精度浮点数,保留小数点后9位)
样例输入
5 7
样例输出
0.714285714
参考范例

#include<stdio.h>
int main()
{
	int a,b; 
	scanf("%d%d",&a,&b);
	printf("%.9lf",1.0*a/b);
	return 0;
}

3. 数字判断
输入一个字符,如果输入的字符是数字,输出yes, 否则输出no
输入
一个字符
输出
如果输入的字符是数字,输出yes, 否则输出no
样例输入
样例1输入:
5
样例2输入:
A
样例输出
样例1输出:
yes
样例2输出:
no
参考范例

#include <stdio.h>
int main() 
{
    char ch;
    scanf("%c",&ch);
	if(ch>='0'&&ch<='9')
		printf("yes");
    else
    	printf("no");
	return 0;
}

4. 统计数
给定一个数的序列S,以及一个区间[L, R], 求序列中介于该区间的数的个数,即序列中大于等于L且小于等于R的数的个数。

输入
第一行3个整数n、L、R,分别表示序列的长度,区间的左端点,区间的右端点。(0 < n ≤ 10000, 1 ≤ L ≤ R ≤ 1000000)
第二行n个正整数,表示序列里的每一个数,每个数小于等于10000000
输出
输出一个整数,表示序列中大于等于L且小于等于R的数的个数。
样例输入
5 1 10
11 8 1 10 16
样例输出
3
参考范例

#include <stdio.h>
int main()
{
	int n,l,r,s=0,x;
	scanf("%d%d%d",&n,&l,&r);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		if(x>=l && x<=r) 
			s++;
	}
	printf("%d",s);
	return 0;
}

5.硬币翻转
假设有N个硬币(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于正面向上的状态;有M个人(M为不大于N的正整数)也从1到M依次编号。
第一个人(1号)将硬币全部翻转一次,第二个人(2号)将编号为2的倍数的硬币翻转一次,第三个人(3号)将编号为3的倍数的硬币翻转一次。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的硬币翻转一次。
请问:当第M个人操作之后,哪些硬币是正面向上的,按从小到大输出其编号,以空格分开。

输入
输入正整数N和M,以单个空格隔开。
输出
顺次输出正面向上的硬币的编号,其间用空格间隔。
样例输入
10 10
样例输出
2 3 5 6 7 8 10

参考范例

#include<stdio.h>
//此题与开关灯问题是同一问题
int main()
{
    int N,M,i,sum=0;//N是硬币数,M是人数,i用于循环判断,
	                //sum是硬币被翻次数
    scanf("%d %d",&N,&M);//按题目要求输入N和M
    for( i=1;i<=N;i++)//从第个硬币开始遍历判断硬币状态
    {
        sum = 0 ;
        for(int j=1;j<=i&&j<=M;j++)//每个硬币按人数遍历判断
        {
            if(i%j==0)//判断硬币编号是否人序号的倍数
            {
                sum++;//是人序号倍数则硬币被操翻次数加1
            }          
        }
        if(sum%2==0) //判断硬币被操翻次数是否偶数,是说明正面向上
            printf("%d,",i);//输出该硬币编号和逗号
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江湖之远izxg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值