6-1 反置数 (100 分)
一个整数的“反置数”指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数是以0结尾,那么在它的反置数当中,这些0就被省略掉了。比如说,12345的反置数是 54321,而3200的反置数是23。请你设计一个求一个整数反置数的函数。
输入只有一行,为一个整数n(0<n)。
输出也只有一个整数,为n的反置数。测试用例保证所有整数都可以用int存储。
函数接口定义:
int reverse(int n) ;
其中 n
是用户传入的参数。函数须返回 n
的反置数。
裁判测试程序样例:
#include <stdio.h>
int reverse(int n) ;
int main()
{
int n ;
scanf( "%d" , &n );
printf( "%d\n" , reverse(n) );
return 0 ;
}
/* 请在这里填写答案 */
输入样例一:
12345
输出样例一:
54321
输入样例二:
3200
输出样例二:
23
int reverse(int n)
{
int rev=0;
if(n>=10)
{
for(;n/10!=0;)
{
rev=rev*10+n%10;
n/=10;
}
rev=rev*10+n%10;
}
else
rev=n;
return rev;
}
//20220115
#include <stdio.h>
#include <math.h>
int main(){
int num,reversenum=0;
scanf("%d",&num);
while (num>0) {
reversenum = reversenum * 10 + num % 10;
num /= 10;
}
printf("%d",reversenum);
}
7-1 大小写转换 (100 分)
现有一个长度不超过100的字符串,该字符串只包含ascii可视字符。请写一段程序将其中的大写字母全部转换为对应的小写字母,小写字母全部转换为对应的大写字母。
输入格式:
只有一行以回车换行符‘\n’结尾的字符串,为待处理字符串。测试用例保证输入合法。
输出格式:
也只有一行,为转换后的对应字符串。
输入样例:
HelloWorld!
输出样例:
hELLOwORLD!
#include<stdio.h>
int main()
{
char cha;
scanf("%c",&cha);
for(;cha!='\n';)
{
if(cha>='a'&&cha<='z')
{
printf("%c",cha-32);
}
else if(cha>='A'&&cha<='Z')
{
printf("%c",cha+32);
}
else
printf("%c",cha);
scanf("%c",&cha);
}
}
//for循环之前先读入一个数字,每次for循环最后都读入一个数字,为下次for做好准备
//对于char相关的题目,类型必须定义为char,但是可以正常按需求进行数学运算,最后输出的结果还会是个char
7-2 闰年的个数 (100 分)
地球绕太阳运行周期为365天5小时48分46秒(合365.24219天),即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,每四年累积约一天,把这一天加于2月末(即2月29日),使当年时间长度变为366日(1-12月分别为31天,29天,31天,30天,31天,30天,31天,31天,30天,31天,30天,31天),这一年就为闰年。需要注意的是,公历是根据罗马人的"儒略历"改编而得。由于当时没有了解到每年要多算出0.0078天的问题,从公元前46年,到16世纪,一共累计多出了10天。为此,当时的教皇格列高利十三世,将1582年10月5日人为规定为10月15日。并开始了新闰年规定。即规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的就是平年。比如,1700年、1800年和1900年为平年,2000年为闰年。此后,平均每年长度为365.2425天,约4年出现1天的偏差。按照每四年一个闰年计算,平均每年就要多算出0.0078天,经过四百年就会多出大约3天来,因此,每四百年中要减少三个闰年。闰年的计算,归结起来就是通常说的:四年一闰;百年不闰,四百年再闰。
现有若干行年份,请你写一段程序分别统计每一行中有多少个闰年。
输入格式:
第一行为一个整数n(0<n<=10),代表测试用例行数。后边是n行,每行为若干个用空格分隔的正整数(代表需要统计的年份,这些年份值在1到3000之间)。这些正整数的最后是-1,表示此行结束。
输出格式:
为n行,每行一个整数,对应于输入的每一行中闰年的个数。
输入样例:
3
1900 1968 1991 2009 1938 1982 1972 1939 1989 -1
1979 1933 1976 1922 1950 2014 1958 -1
2016 1921 1904 1982 1968 1995 1956 1907 1978 2001 1965 1990 2014 1947 -1
输出样例:
2
1
4
#include<stdio.h>
int isLeapYear(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)
{
return 1;
}
else
return 0;
}
int main()
{
int i,line,year,num;
scanf("%d",&line);
for(i=1;i<=line;i++)
{
num=0;
scanf("%d",&year);
for(;year!=-1;)
{
if(isLeapYear(year)==1)
{
num++;
}
scanf("%d",&year);
}
printf("%d\n",num);
}
}
//主函数定义的变量只能在主函数中使用,子函数不能使用。
//所以本题不能试图将num在子函数中自增然后返回主函数。
//策略:需要自增时返回个1,不需要时返回0,然后在主函数里if语句判断一下
7-3 打印图形二 (100 分)
用'*'(星号)和'.'(点)空格打印如下图案。
输入格式:
只有一行为用空格分隔的三个整数,依次为l,c和n(0<l,c,n<20)。其中l和c分别代表格子的行数和列数;n代表格子内点的列数(格子内点的行数固定为3)。具体见输出样例。
输出格式:
根据给定的行列等参数输出图形(请看输出样例)。
输入样例:
2 5 2
输出样例:
****************
*..*..*..*..*..*
*..*..*..*..*..*
*..*..*..*..*..*
****************
*..*..*..*..*..*
*..*..*..*..*..*
*..*..*..*..*..*
****************
//20220115
#include <stdio.h>
#include <math.h>
int main(){
int l,c,n;
scanf("%d %d %d",&l,&c,&n);
for (int i = 0; i < c*(1+n)+1; ++i) {
printf("*");
}
printf("\n");
for (int i = 0; i < l; ++i) {
for (int j = 0; j < 3; ++j) {
for (int k = 0; k < c; ++k) {
printf("*");
for (int m = 0; m < n; ++m) {
printf(".");
}
}
printf("*\n");
}
for (int p = 0; p < c*(1+n)+1; ++p) {
printf("*");
}
printf("\n");
}
}
7-4 三对三篮球赛之加时赛 (100 分)
三对三篮球赛规定
第4条:得分
4.1. 在圆弧线以内投篮命中得 1 分。
4.2. 在圆弧线以外投篮命中得 2 分
4.3. 罚篮命中得 1 分。
第5条:比赛时间/优胜者
5.1 一节 10 分钟(这个可以称为常规时间)。在死球状态下和罚球时应停表。再次开球时,当球权方与防守队一名球员完成一次传递球后(即一旦进攻队持球),计时器应继续计时。
5.2. 但是,在规定的比赛时间内(即在常规时间内),率先取得 21 分或以上的队伍获胜。
5.3. 如果在规定比赛时间(即在常规时间内)两队打平,则应进行加时赛。加时赛中率先取得 2 分的队伍获胜。
注意:判断胜负的一个基本原则是得分高的队伍获胜(但规则里没有明确说明)。
现有一场比赛经过加时赛分出了胜负,请你根据以上所有条件写一段程序来判断这场比赛的结果。
输入格式:
为用空格分隔的两个非负整数,依次代表A队得分和B队得分。测试用例保证合法且可以用int存储。
输出格式:
如果A队获胜,则输出A win;如果B队获胜,则输出B win;如果出现不可能的比分(比如 29 30),则输出error。
输入样例:
11 12
输出样例:
B win
#include<stdio.h>
int main()
{
int ascore,bscore;
scanf("%d %d",&ascore,&bscore);
if((ascore==0&&bscore==1)||(ascore==1&&bscore==0))
printf("error");
else if(ascore<=23&&bscore<=23&&ascore-bscore<=3&&bscore-ascore<=3&&ascore!=bscore)
{
if(ascore>bscore)
printf("A win");
else
printf("B win");
}
else
{
printf("error");
}
}
//严谨考虑:必须单独考虑一下0:1是不可能的情况,但是未能排除掉,所以应该单独写一句if来排除
7-5 倒立勾股数 (100 分)
一组正整数 x , y , z,如果满足:
x21+y21=z21
我们则称x , y , z为一组倒立勾股数。你的任务是写一段程序计算出在某个范围内共有多少组倒立勾股数。
输入格式:
只有一行,为两个用空格分隔的正整数,依次为m,n(0<m<n<=1000)。
输出格式:
只有一个整数,代表m和n之间倒立勾股数的组数。
提示:
1、要x,y和z均满足大于等于m且小于等于n才计数。
2、15 20 12 与 20 15 12 是一组,不能算成2组。
3、虽然m,n均小于1001,但要考虑运算过程中整数是否溢出。
输入样例:
1 60
输出样例:
3
#include<stdio.h>
int main()
{
long long m,n,x,y,z,num;
scanf("%lld %lld",&m,&n);
for(x=m;x<=n;x++)
{
for(y=x;y<=n;y++)
{
for(z=y;z<=n;z++)
{
if(x*x*(z*z+y*y)==z*z*y*y)
{
num++;
}
}
}
}
printf("%lld",num);
}
//数字太大了,用long long才够用,注意long long对应的是%lld
7-6 Catalan数 (100 分)
Catalan数即卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中的数列,以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名。它是一个序列,为C0,C1,C2等等,其中
Cn=n+11(n2n)=(n+1)!n!(2n)!=∏k=2nkn+k
这里 n 大于等于 0,前几个 Catalan数为 C0=1,C1=1,C2=2,C3 = 5等。现请你写一段程序来计算Catalan数。
注意:此题打表过测试用例或过题给负100分。
输入格式:
为一个整数 n (0<=n<=32)。
输出格式:
为第 n 项 catalan 数 (数字特别大,建议数据类型使用 long long)。
输入样例:
5
输出样例:
42
#include<stdio.h>
long long cat(long long n)
{
//long long res;
if(n==1 || n==0)
{
return 1;
}
else
{
//res=cat(n-1)*(4*n-2)/(n+1);
return cat(n-1)*(4*n-2)/(n+1);
}
}
int main()
{
long long n,res;
scanf("%lld",&n);
res=cat(n);
printf("%lld",res);
}
//用递推公式可以有效避免溢出,递推可以采用递归算法