2021计算导论第一次机考

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=2n​kn+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);
    
}
//用递推公式可以有效避免溢出,递推可以采用递归算法
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
荣耀社招2021的C语言部分是对应岗位的编程能力进行测试的一项试。C语言是一种广泛应用于嵌入式系统和高性能应用程序开发的计算编程语言,对于软件工程师而言,具备良好的C语言编程能力是必不可少的。 C语言试内容主要包括基础语法、数据类型、运算符、控制结构、函数、指针、数组等方面的知识。生需要理解程序的控制流,并能够正确运用C语言的语法和特性进行编程。试题目可能涵盖算法设计、字符串处理、数组操作、结构体操作等多种类型的编程问题。 在过程中,生需要根据题目要求,使用C语言编写程序,完成所要求的功能。试时间有限,对于生来说,合理的时间管理和高效的编程技巧是非常重要的。同时,代码的可读性和规范性也是试评判的重点之一。 对于荣耀社来说,通过测试C语言编程能力,能够筛选出具备较高编程素养的求职者,为公司招聘高质量的人才提供了重要的参。具备出色的C语言编程能力的人员可以更好地适应公司的技术需求,提供高质量的代码实现和良好的工程实践。 总而言之,荣耀社招2021C语言部分是对求职者C语言编程能力的察,生需要展现出扎实的基础知识,合理的编程思路和高效的编程能力。通过,荣耀社可以筛选出具备出色编程能力的求职者,为公司的技术发展做出贡献。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值