团体程序设计天梯赛-练习集(详解)

习题集(c语言实现)

其中标*的是我认为比较有难度的题目,L1部分已全部完成

L1-001 Hello World

这道超级简单的题目没有任何输入。

你只需要在一行中输出著名短句“Hello World!”就可以了。

代码实现

#include<stdio.h>
int main(){
    printf("Hello World!");
    return 0;
}

L1-002 打印沙漏*

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

实现思路

         本题个人觉得有一点绕,建议先理清楚思路再进行作答,先判断出需要输出多少行,然后找规律,每行需要输出多少个空格,需要输出多少个字符

代码实现

#include<stdio.h>
 
int main() {
    int n; // 输入的符号数量
    char c; // 要打印的符号
    scanf("%d %c", &n, &c); // 读取输入
    int sum = 0; // 用于存储每一行的符号数量总和
    int i = 1; // 用于循环的变量,初始为1,每次递增2
    // 计算沙漏的高度(从顶部到中心)并找到对应的行数
    for (i = 3;; i += 2) {
        sum += i; // 增加当前行的符号数量
        if (sum * 2 + 1 > n) { // 如果总符号数量超过输入数量,则退出循环
            i = i - 2; // 回退一行
            break;
        }
    }
    int temp = i; // 临时变量,用于保存沙漏的高度
 
    int count = 0; // 用于计算每行需要打印的符号数量
    // 打印沙漏的上半部分
    while (i > 0) {
        count = 0; // 初始化每行的符号数量
        for (int j = i; j > 0; j--) {
            count++; // 增加当前行的符号数量
        }
        // 打印每行前面的空格
        for (int q = 0; q < (temp - count) / 2; q++) printf(" ");
        // 打印当前行的符号
        for (int j = i; j > 0; j--) {
            printf("%c", c);
            count++;
        }
        printf("\n"); // 换行
        i = i - 2; // 递减,准备打印下一行
    }
 
    i = i + 4; // 恢复 i 的值,用于打印沙漏的下半部分
    // 打印沙漏的下半部分
    while (i <= temp) {
        count = 0; // 初始化每行的符号数量
        for (int j = i; j > 0; j--) {
            count++; // 增加当前行的符号数量
        }
        // 打印每行前面的空格
        for (int q = 0; q < (temp - count) / 2; q++) printf(" ");
        // 打印当前行的符号
        for (int j = i; j > 0; j--) {
            printf("%c", c);
            count++;
        }
        printf("\n"); // 换行
        i = i + 2; // 递增,准备打印下一行
    }
    // 计算并打印剩余的符号数量
    sum = 0;
    while (temp > 1) {
        sum += temp; // 增加当前行的符号数量总和
        temp -= 2; // 减少行数
    }
    sum = sum * 2 + 1; // 计算剩余符号数量
    printf("%d", n - sum); // 打印剩余符号数量
    return 0;
}

L1-003 个位数统计

给定一个 k 位整数 N=dk−1​10k−1+⋯+d1​101+d0​ (0≤di​≤9, i=0,⋯,k−1, dk−1​>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

代码实现

#include<stdio.h>
#include<string.h>
int main()
{
    //避免输入的数溢出,所以用char类型存储 
	char a[1005];
	scanf("%s", a);
	//用arr统计出现的个数 
	int arr[10] = {0},c;
	for (int i = 0; i < strlen(a); i++)
	{
		c = a[i] - '0';
		arr[c]++;
	}
	//输出 
	for (int j = 0; j < 10; j++)
	{
		if (arr[j] != 0)
			printf("%d:%d\n", j, arr[j]);
	}
	return 0;
}

L1-004 计算摄氏温度

给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。

代码实现

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int c=5*(n-32)/9;
    printf("Celsius = %d",c);
	return 0;
}

L1-005 考试座位号

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

代码实现

#include<stdio.h>

typedef struct student{
     int exam[16];
     int com;
     int test;
}; 

int main()
{
    int n;
    scanf("%d",&n);
    student s[n];
    for(int i=0;i<n;i++){
        scanf("%s %d %d",&s[i].exam,&s[i].com,&s[i].test);
    }
    int m;
    scanf("%d",&m);
    int res[m];
    for(int j=0;j<m;j++){
        scanf("%d",&res[j]);
    }
    for(int p=0;p<m;p++){
        for(int q=0;q<n;q++){
            if(res[p]==s[q].com)
            printf("%s %d\n",s[q].exam,s[q].test);
        }
    }
	return 0;
}

L1-006 连续因子**

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1<N<231)。

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

输出样例:

3
5*6*7

实现思路

1.采用枚举的办法,从2开始循环,找该数的连续因子,并且记录连续因子的长度和开始的值

2.输出最长连续因子的个数以及最小的连续因子序列。

代码实现

#include<stdio.h>
#include<math.h>

int main() {
    int n;
    scanf("%d",&n);
    int max=0,start=0;//最长连续字串长度和开始下标 
    for(int i=2;i<sqrt(n);i++){
        int count=0,num=1;
        for(int j=i;n%num==0;j++){
            if(num!=1) count++;
            num*=j;
        }
        if(count>max){
            start=i;
            max=count;
        }
    }
    if(max==0){
        printf("1\n");
        printf("%d",n);
    }else{
        printf("%d\n",max);
        for(int i=start;i<start+max;i++){
            if(i<start+max-1)
            printf("%d*",i);
            else
            printf("%d",i);
        }
    }
    return 0;
}

L1-007 念数字

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

代码实现

#include <stdio.h>

int main() {
    int n;
    scanf("%d",&n);
    if(n<0) {
        printf("fu ");
        n=-n;
    }
    if(n==0){
        printf("ling");
        return 0;
    }
    int a[10]={0},i=0;
    while(n){
        a[i]=n%10;
        i++;
        n=n/10;
    }
    for(int j=i-1;j>=0;j--){
        if(j!=0){
        switch(a[j]){
        case 0:printf("ling ");break;
        case 1:printf("yi ");break;
        case 2:printf("er ");break;
        case 3:printf("san ");break;
        case 4:printf("si ");break;
        case 5:printf("wu ");break;
        case 6:printf("liu ");break;
        case 7:printf("qi ");break;
        case 8:printf("ba ");break;
        case 9:printf("jiu ");break;
     } 
    }else{
        switch(a[j]){
        case 0:printf("ling");break;
        case 1:printf("yi");break;
        case 2:printf("er");break;
        case 3:printf("san");break;
        case 4:printf("si");break;
        case 5:printf("wu");break;
        case 6:printf("liu");break;
        case 7:printf("qi");break;
        case 8:printf("ba");break;
        case 9:printf("jiu");break;
     } 
    } 
    }
    printf("\n");
    return 0;
}

L1-008 求整数段和

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。

代码实现

/*给定两个整数A和B,输出从A到B的所有整数以及这些数的和。*/
#include <stdio.h>

int main() {
    int a,b,sum=0,count=0;
    scanf("%d %d",&a,&b);
    for(int i=a;i<=b;i++){
        printf("%5d",i);
        sum+=i;
        count++;
        if(count%5==0) printf("\n");
    }
    if(count%5!=0) printf("\n");
    printf("Sum = %d",sum);
    return 0;
}

L1-009 N个数求和*

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

思路实现

先找分母的最小公倍数,通分,然后找分子,分母的最大公约数,约分,根据条件进行输出。

(为什么要找最小公倍数,如果直接每个分母相乘,可能会造成溢出)

代码实现

#include<stdio.h>

//最大公约数 
long gcd(long a,long b){
    while(b!=0){
        long temp=b;
        b=a%b;
        a=temp;
    }
    return a;
} 
//最小公倍数 
long lcm(long a,long b){
    return a*b/gcd(a,b);
}


int main() {
    int n;
    scanf("%d",&n);
    long son[n],dad[n],sum1=0,sum2=1;
    for(int i=0;i<n;i++){
        scanf("%ld/%ld",&son[i],&dad[i]);
        sum2=lcm(sum2,dad[i]);
    }
    for(int j=0;j<n;j++){
        son[j]=son[j]*(sum2/dad[j]);
        sum1+=son[j];   
    }
    long temp=gcd(sum1,sum2);
    sum1=sum1/temp;sum2=sum2/temp;
    if (sum1 == 0) {    
        printf("0\n");
    } else if (sum2 == 1) {
        printf("%ld\n", sum1);
    } else {
        if (sum1 / sum2 > 0) {
            printf("%ld ", sum1 / sum2);
            sum1 = sum1 - sum2 * (sum1 / sum2);
        }
        printf("%ld/%ld\n", sum1, sum2);
    }
    return 0;
}

L1-010 比较大小

本题要求将输入的任意3个整数从小到大输出。

代码实现

#include <stdio.h>

int main() {
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    if(a<=b&&a<=c){
       printf("%d->",a); 
       if(b<c){
          printf("%d->%d",b,c); 
       }else{
          printf("%d->%d",c,b); 
       }
    }
    else if(b<=a&&b<=c){
       printf("%d->",b); 
       if(a<c){
          printf("%d->%d",a,c); 
       }else{
          printf("%d->%d",c,a); 
       }
    }
    else if(c<=a&&c<=b){
       printf("%d->",c); 
       if(a<b){
          printf("%d->%d",a,b); 
       }else{
          printf("%d->%d",b,a); 
       }
    }
    return 0;
}

L1-011 A-B*

本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。

输入格式:

输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:

在一行中打印出A−B的结果字符串。

输入样例:

I love GPLT!  It's a fun game!
aeiou

输出样例:

I lv GPLT!  It's  fn gm!

实现思路

用一个辅助数组count,记录下b数组中出现过的字符,遍历a字符,如果在b中没有出现过就输出

代码实现

#include<stdio.h>
#include<string.h>

int main() {
    char a[10001],b[10001];
    int q=0,p=0;
    while((a[q]=getchar())!='\n'){
        q++;
    }
    while((b[p]=getchar())!='\n'){
        p++;
    }
    int count[129]={0};
    for(int i=0;i<strlen(b);i++){
        count[b[i]]++;
    }
    for(int j=0;j<strlen(a);j++){
        if(count[a[j]]==0){
            printf("%c",a[j]);
        }
    }
    return 0;
}

L1-012 计算指数

真的没骗你,这道才是简单题 —— 对任意给定的不超过 10 的正整数 n,要求你输出 2n。不难吧?

代码实现

#include<stdio.h>
#include<math.h>
int main(){
    int n,sum;
    scanf("%d",&n);
    sum=pow(2,n);
    printf("2^%d = %d",n,sum);
}

L1-013 计算阶乘和

对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!

代码实现

#include<stdio.h>

int func(int n){
    int res=1;
    for(int i=1;i<=n;i++){
        res*=i;
    }
    return res;
}

int main(){
    int n,sum=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        sum+=func(i);
    }
    printf("%d",sum);
}

L1-014 简单题

这次真的没骗你 —— 这道超级简单的题目没有任何输入。

你只需要在一行中输出事实:This is a simple problem. 就可以了。

代码实现

#include<stdio.h>
int main(){
    printf("This is a simple problem.");
}

L1-015 跟奥巴马一起画方块

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!

代码实现

/*美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。
2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。*/

#include<stdio.h>

int main(){
    int n;
    char c;
    float row;
    scanf("%d %c",&n,&c);
    if(n%2==0)
    row=n/2;
    else
    row=n/2+1;
    for(int i=0;i<row;i++){
        for(int j=0;j<n;j++){
            printf("%c",c);
        }
        printf("\n");
    }
}

L1-016 查验身份证

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

代码实现

#include<stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    char people[n][18];
    for(int i=0;i<n;i++){
        scanf("%s",&people[i]);
    }
    int num[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    char res[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; 
    int sum=0;
    int flag=0;
    for(int j=0;j<n;j++){
        for(int p=0;p<17;p++){
            sum+=(people[j][p]-'0')*num[p];
        }
        if(res[sum%11]!=people[j][17]){
            for(int q=0;q<18;q++){
                printf("%c",people[j][q]);
            }
            printf("\n");
            flag=1;
        }
        sum=0;
    }
    if(flag==0){
        printf("All passed");
    }
    return 0;
}

L1-017 到底有多二

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。

代码实现

#include<stdio.h>
int main(){
    char a[51]={0};
    int i=0,count=0;
    while((a[i]=getchar())!='\n'){
        i++;
    }
    for(int j=0;j<i;j++){
        if(a[j]=='2'){
            count++;
        }
    }
    double res=1.0;
    if(a[i-1]%2==0){
        res=res*2.0; 
    }
    if(a[0]=='-') {
        i=i-1;
        res=res*1.5;
    }
    res*=count*100.0/i;
    printf("%.2lf%%",res);
    return 0;
}

L1-018 大笨钟

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。

下面就请你写个程序,根据当前时间替大笨钟敲钟。

代码实现

#include<stdio.h>
main()
{
	int m, n,h,i,k;
	scanf("%d:%d", &m, &n);
	if (m >= 13 && m < 24)
	{
		h = m - 12;
		if (n != 0)
			k = h + 1;
		else if (n == 0)
			k = h;

		for (i = 0; i < k; i++)
		{
			printf("Dang");
		}
	}
	else
		printf("Only %02d:%02d.  Too early to Dang.",m,n);
}

L1-019 谁先倒

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。

代码实现

#include<stdio.h>
main()
{
    int a,b,counta,countb;//甲,乙分别能够喝的杯数 
    scanf("%d %d",&a,&b);
    counta=a,countb=b;
    int n;//n轮游戏
    scanf("%d",&n);
    int ahan[n],ahua[n],bhan[n],bhua[n];
    for(int i=0;i<n;i++){
        scanf("%d %d %d %d",&ahan[i],&ahua[i],&bhan[i],&bhua[i]);
        if(ahua[i]!=bhua[i]){
            if(ahan[i]+bhan[i]==ahua[i]) a--;
            if(ahan[i]+bhan[i]==bhua[i]) b--;   
        }
        if(a<0){
            printf("A\n");
            printf("%d",countb-b);
            break;
        }
        if(b<0){
            printf("B\n");
            printf("%d",counta-a);
            break;
        }
    } 
}

L1-020 帅到没朋友*

当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。

输入格式:

输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(≤10000),为待查询的人数;随后一行中列出M个待查询的ID,以空格分隔。

注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有K超过1的朋友圈里都至少有2个不同的人。

输出格式:

按输入的顺序输出那些帅到没朋友的人。ID间用1个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出No one is handsome

注意:同一个人可以被查询多次,但只输出一次。

实现思路

用一个大数组标识出现过的id号,然后遍历输出没有朋友的人

代码实现

#include <stdio.h>

int main()
{
	int order[100000] = { 0 };//定义一个大数组用于标识出现过的id号 
	int n, k, m, check;   
	int i, j, d = 0, s, sum = 0;   //d为判断空格的标志; sum为“没朋友”的总人数
	scanf("%d", &n);
	for (i = 0; i < n; i++)      //将朋友圈所有的人接收进来,按要求对order数组进行更改
	{
		scanf("%d", &k);
		if (k == 1)
		{
			scanf("%d", &s);
			continue;
		}
		for (j = 0; j < k; j++)
		{
			scanf("%d", &s);
			order[s]++;
		}
	}
	scanf("%d", &m);
	for (i = 0; i < m; i++)
	{
		scanf("%d", &check);
		if (order[check] == 0)   //判断是否“没朋友”,若是则按格式输出
		{
			if (d == 0)
				d++;
			else
				printf(" ");
			printf("%05d", check);
			order[check] = 1;  //将已经输出“没朋友”的人看作“有朋友”,防止重复导致的第二次输出
			sum++;
		}
	}
	if (sum == 0)
		printf("No one is handsome");
	return 0;
}

L1-021 重要的话说三遍

这道超级简单的题目没有任何输入。

你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了。

注意每遍占一行,除了每行的回车不能有任何多余字符。

代码实现

#include<stdio.h>
int main(){
    printf("I'm gonna WIN!\n");
    printf("I'm gonna WIN!\n");
    printf("I'm gonna WIN!\n");
}

L1-022 奇偶分家

给定N个正整数,请统计奇数和偶数各有多少个?

代码实现

/*给定N个正整数,请统计奇数和偶数各有多少个?*/ 
#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	int a[n]={0},odd=0,even=0;
	for(int i=0;i<n;i++){
	    scanf("%d",&a[i]);
	    if(a[i]%2!=0) odd++;
	    if(a[i]%2==0) even++;
    }
    printf("%d %d",odd,even);
	return 0;
}

L1-023 输出GPLT

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。

代码实现

/*给定N个正整数,请统计奇数和偶数各有多少个?*/ 
#include <stdio.h>
#include <string.h>

int main()
{
	char c[10001];
	scanf("%s",&c);
	int t=0,g=0,p=0,l=0;
	for(int i=0;i<strlen(c);i++){
	    if(c[i]=='G'||c[i]=='g') g++;
	    if(c[i]=='P'||c[i]=='p') p++;
	    if(c[i]=='L'||c[i]=='l') l++;
	    if(c[i]=='T'||c[i]=='t') t++;
    }
    while(t>0||g>0||p>0||l>0){
        if(g>0){
            printf("G");
            g--;
        }
        if(p>0){
            printf("P");
            p--;
        }
        if(l>0){
            printf("L");
            l--;
        }
        if(t>0){
            printf("T");
            t--;
        }
    }
	return 0;
}

L1-024 后天

如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。

代码实现

#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	if(n+2>7)
	n=(n+2)%7;
	else
	n=n+2;
	printf("%d",n);
	return 0;
}

L1-025 正整数A+B*

题的目标很简单,就是求两个正整数AB的和,其中AB都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。

输入格式:

输入在一行给出AB,其间以空格分开。问题是AB不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是AB的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。

输出格式:

如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?

输入样例1:

123 456

输出样例1:

123 + 456 = 579

输入样例2:

22. 18

输出样例2:

? + 18 = ?

输入样例3:

-100 blabla bla...33

输出样例3:

? + ? = ?

实现思路

遍历a和b,如果有字符不符合数字的情况,就标记,如果都是数字,转成int类型用于计算,最后根据题意进行输出

代码实现

#include <stdio.h>

int main() {
    char a[1001], b[1001];
    int p = 0;
    while ((a[p] = getchar()) != ' ') {
        p++;
    }
    int q = 0;
    while ((b[q] = getchar()) != '\n') {
        q++;
    }
    int flaga = 0, flagb = 0, suma = 0, sumb = 0, flag = 1;
    for (int i = p - 1; i >= 0; i--) {
        if (a[i] < '0' || a[i] > '9') {
            flaga = 1;
            break;
        } else {
            suma = suma + (a[i] - '0') * flag;
            flag *= 10;
        }
    }
    flag = 1;
    for (int i = q-1; i >= 0; i--) {
        if (b[i] < '0' || b[i] > '9') {
            flagb = 1;
            break;
        } else {
            sumb += (b[i] - '0') * flag;
            flag *= 10;
        }
    }
    if(suma>1000||suma<1) flaga++;
    if(sumb>1000||sumb<1) flagb++;
    if (flaga == 0 && flagb == 0) {
        printf("%d + %d = %d\n", suma, sumb, suma + sumb);
    } else if (flaga == 0 && flagb != 0) {
        printf("%d + ? = ?\n", suma);
    } else if (flaga != 0 && flagb == 0) {
        printf("? + %d = ?\n", sumb);
    } else {
        printf("? + ? = ?\n");
    }
    return 0;
}

L1-026 I Love GPLT

这道超级简单的题目没有任何输入。

你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。

所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。

代码实现

#include<stdio.h>
int main(){
    printf("I\n");
    printf(" \n");
    printf("L\n");
    printf("o\n");
    printf("v\n");
    printf("e\n");
    printf(" \n");
    printf("G\n");
    printf("P\n");
    printf("L\n");
    printf("T\n");
    return 0;
}

L1-027 出租

一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1index[1]=0 对应 arr[0]=8index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100

本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

代码实现

/*输入格式:
输入在一行中给出一个由11位数字组成的手机号码。

输出格式:
为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。
*/

#include<stdio.h>

int main(){
    char tel[11]={0};
    scanf("%s",&tel);
    int count[10]={0},countdot=0;
    for(int i=0;i<11;i++){
        if(count[(tel[i]-'0')]==0){
            countdot++;
            count[(tel[i]-'0')]++;
        }
    }
    int map[countdot]={0};int k=0;
    printf("int[] arr = new int[]{");
    for(int i=9;i>=0;i--){
        if(count[i]==1&&countdot>1){
            map[k]=i;k++;
            printf("%d,",i);countdot--;   
        }else if(count[i]==1&&countdot==1){
            map[k]=i;k++;
            printf("%d};",i);countdot--;   
        }
    }
    printf("\nint[] index = new int[]{");
    for(int j=0;j<11;j++){
        for(int i=0;i<k;i++){
            if((tel[j]-'0')==map[i]&&j!=10){
                printf("%d,",i);
            }else if((tel[j]-'0')==map[i]&&j==10){
                printf("%d};",i);
            }
        }
    }
    return 0;
}

L1-028 判断素数

本题的目标很简单,就是判断一个给定的正整数是否素数。

代码实现

#include<stdio.h>
#include<math.h>

int main(){
    int n,num,flag=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        flag=0;
        scanf("%d",&num);
        if (num == 1)
            flag = 1;
        for(int j=2;j<=sqrt(num);j++){
            if(num%j==0){
                flag=1;
                break;
            }
        }
        if(flag==0) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

L1-029 是不是太胖了

据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)

代码实现

 #include<stdio.h>

int main(){
    int H;
    scanf("%d",&H);
    double res=(H-100)*0.9*2;
    printf("%.1lf",res);    
    return 0;
}

L1-030 一帮一

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

代码实现

#include <stdio.h>

typedef struct student{
    int sex;
    char name[9];
}student;

int main()
{
    int n;
    scanf("%d",&n);
    student s[n];
    for(int i=0;i<n;i++){
        scanf("%d %s",&s[i].sex,&s[i].name);
    }
    for(int i=0;i<n;i++){
        for(int j=n-1;j>=0;j--){
            if(s[i].sex+s[j].sex==1){
                s[i].sex=2;s[j].sex=2;
                printf("%s %s\n",s[i].name,s[j].name);
            }
        }
    }
    return 0;
}

L1-031 到底是不是太胖了

据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知 1 公斤等于 2 市斤。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。

代码实现

#include <stdio.h>
#include <math.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        double h=0;
        double w=0;
        scanf("%lf %lf",&h,&w);
        double stander=(h-100)*1.8;
        if(fabs(w-stander)<stander*0.1)
                printf("You are wan mei!\n");
           else  if(w<stander)
            printf("You are tai shou le!\n");
                else
                    printf("You are tai pang le!\n");
        
    }
        return 0;
}

L1-032 Left-pad

根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块?就是在字符串前填充一些东西到一定的长度。例如用*去填充字符串GPLT,使之长度为10,调用left-pad的结果就应该是******GPLT。Node社区曾经对left-pad紧急发布了一个替代,被严重吐槽。下面就请你来实现一下这个模块。

代码实现

#include <stdio.h>

int main()
{
    int n;
    char c;
    scanf("%d %c",&n,&c);
    getchar();//消耗掉前面输入的换行符 
    int i=0; 
    char s[100000]={0};
    while((s[i]=getchar())!='\n'){
        i++;
    }
    for(int j=n-i;j>0;j--){
        printf("%c",c);
    }
    //输入的字符串小于n 
    if(i<n){
        for(int k=0;k<i;k++){
        printf("%c",s[k]);
        }  
    }else{
        for(int k=i-n;k<i;k++){
        printf("%c",s[k]);
        } 
    } 
    return 0;
}

L1-033 出生年*

以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。

以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。

输入格式:

输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。

输出格式:

根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。

输入样例1:

1988 4

输出样例1:

25 2013

输入样例2:

1 2

输出样例2:

0 0001

实现思路

枚举,用一个数组用于存储出现过的数字,如果出现过的数字等于所给的n,结束循环,输出

代码实现

/*我出生于y年,直到x岁才遇到n个数字都不相同的年份*/ 

#include<stdio.h>
int main()
{
    int i,y,x,n,temp,count=0;
    scanf("%d %d",&y,&n);
    int arr[10]={0};
    for(i=y;;i++){
        temp=i;
        for(int q=0;q<4;q++){
            arr[i%10]++;
            i=i/10;
        }
        for(int j=0;j<10;j++){
            if(arr[j]!=0) count++;
        }
        if(count==n){
            printf("%d %04d",temp-y,temp);
            break;
        }
        count=0;
        i=temp;
        for(int p=0;p<10;p++){
            arr[p]=0;
        }
    } 
	return 0;
}

L1-034 点赞

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。

代码实现

/**/ 

#include<stdio.h>
int main()
{
    int n,m,k,i,q;
    scanf("%d",&n);
    int num[1001]={0};
    for(int i=0;i<n;i++){
        scanf("%d",&m); 
        for(int j=0;j<m;j++){
            scanf("%d",&k);
            num[k]+=1;
        }   
    } 
    int max=num[0],res=0;
    for(int q=1;q<1001;q++){
        if(num[q]>=max){
            max=num[q];
            res=q;
        }
    }
    printf("%d %d",res,max);
	return 0;
}

L1-035 情人节*

以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。

以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。

输入格式:

输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过10个英文字母的非空单词,以回车结束。一个英文句点.标志输入的结束,这个符号不算在点赞名单里。

输出格式:

根据点赞情况在一行中输出结论:若存在第2个人A和第14个人B,则输出“A and B are inviting you to dinner...”;若只有A没有B,则输出“A is the only one for you...”;若连A都没有,则输出“Momo... No one is for you ...”。

实现思路

输入每个人的人名,并且统计输入的人名的个数,然后将第二个和第14个人的人名复制出来,根据条件进行输出

代码实现

#include <stdio.h>
#include <string.h>

int main() {
    int count=0;
    char a[11],b[11];
    while(1){
        char name[11];
        scanf("%s",name);
        count++;
        if(count==2){
            strcpy(a,name);
        }
        if(count==14){
            strcpy(b,name);
        }
        if(strlen(name)==1&&name[0]=='.') break;
    }
    count--;
    if(count<2){
        printf("Momo... No one is for you ...");
    }else if(count<14){
        printf("%s is the only one for you...",a);
    }else{
        printf("%s and %s are inviting you to dinner...",a,b);
    }
    return 0;
}

L1-036 A乘以B

看我没骗你吧 —— 这是一道你可以在 10 秒内完成的题:给定两个绝对值不超过 100 的整数 A 和 B,输出 A 乘以 B 的值。

代码实现

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

L1-037 A除以B

真的是简单题哈 —— 给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。

代码实现

#include<stdio.h>
int main(){
    int a,b;
    scanf("%d %d",&a,&b);
    double res=(double)a/b;
    if(b>0) printf("%d/%d=%.2lf",a,b,res);
    else if(b<0) printf("%d/(%d)=%.2lf",a,b,res);
    else printf("%d/%d=Error",a,b);
}

L1-038 新世界

这道超级简单的题目没有任何输入。

你只需要在第一行中输出程序员钦定名言“Hello World”,并且在第二行中输出更新版的“Hello New World”就可以了。

代码实现

#include<stdio.h>
int main(){
    printf("Hello World\n");
     printf("Hello New World");
}

L1-039 古风排版*

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:

输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:

按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。

输入样例:

4
This is a test case

输出样例:

asa T
st ih
e tsi
 ce s

实现思路

计算所需二维数组的行数和列数,从又开始复制字符串,并计数,如果大于字符串的长度后续的字符为“ ”

代码实现

#include <stdio.h>

int main() {
    int n;
    scanf("%d",&n);getchar();
    char s[1001];int index=0;
    while((s[index]=getchar())!='\n'){
        index++;
    }   
    int row=(index-1)/n+1; //列数 
    int line=n;
    char num[line][row];
    int k=0;
    for(int j=row-1;j>=0;j--){
        for(int i=0;i<line;i++){    
            if(k<index){
               num[i][j]=s[k];
               k++; 
            }else{
               num[i][j]=' ';
            }
      }
    }
    for(int i=0;i<line;i++){
        for(int j=0;j<row;j++){
            printf("%c",num[i][j]);
        }
        printf("\n");
    }
    return 0;
}

L1-040 最佳情侣身高差

专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。

下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。

代码实现

/*
专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:
(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。
*/

#include<stdio.h>
typedef struct student{
    char xb;
    double height;
}student;

int main(){
    int n;
    scanf("%d",&n);
    student s[n];
    for(int i=0;i<n;i++){
        scanf(" %c %lf",&s[i].xb,&s[i].height);// 在%c之前添加一个空格,以消耗换行符
    }
    double res[n];
    for(int j=0;j<n;j++){
        if(s[j].xb=='F'){
            res[j]=s[j].height*1.09;
        }else if(s[j].xb=='M'){
            res[j]=s[j].height/1.09;
        }
    }
    for(int p=0;p<n;p++){
        printf("%.2lf\n",res[p]);
    }
    return 0;
}

L1-041 寻找250

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。

代码实现

#include <stdio.h>
int main()
{
	int n = 0, num = 0;
	while (1)
	{
		scanf("%d", &n);
		num++;
		if (n == 250)
		{
			printf("%d", num);
			break;
		}
	}
	return 0;
}

L1-042 日期格式化

世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。

代码实现

#include<stdio.h>

int main() {
    char num[10];
    scanf("%s",&num);
    for(int i=6;i<10;i++){
        printf("%c",num[i]);
    }
    printf("-");
    for(int i=0;i<2;i++){
        printf("%c",num[i]);
    }
    printf("-");
    for(int i=3;i<5;i++){
        printf("%c",num[i]);
    }
    return 0;
}

L1-043 阅览室*

天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。

注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。

输入格式:

输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:

书号([1, 1000]内的整数) 键值SE) 发生时间hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)

每一天的纪录保证按时间递增的顺序给出。

输出格式:

对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。

实现思路

定义一个结构体,用于记录每本书的借出时间,归还时间和状态,根据条件进行输出,每天重新进行初始化,根据条件计算时间并输出。

代码实现

#include<stdio.h>
typedef struct book{
    char status;
    int hour;
    int min;
    int flag;
}book;

int main(){
    int n;
    scanf("%d",&n);    
    for(int i=0;i<n;i++){
        book num[1001];
        book temp[1001];
        for(int i=0;i<1001;i++){
        num[i].flag=0;
        }
        int id=1;
        int count=0,sum=0;
        while(id!=0){
            scanf("%d",&id);
            scanf("%c %d:%d",&num[id].status,&num[id].hour,&num[id].min); 
            if(num[id].status=='S') {
                num[id].flag=1; 
                temp[id].hour=num[id].hour,temp[id].min=num[id].min;
            }
            if(num[id].status=='E'&&num[id].flag==1){
                num[id].flag=0;
                count++;
                sum+=(num[id].hour-temp[id].hour)*60+(num[id].min-temp[id].min);
            }
        }
        if(count!=0)
        printf("%d %.0f\n",count,(float)sum/count);
        else
        printf("0 0\n");
    }
    return 0;
}

L1-044 稳赢

现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每隔K次就让一个平局。

输入格式:

输入首先在第一行给出正整数K(≤10),即平局间隔的次数。随后每行给出对方的一次出招:ChuiZi代表“锤子”、JianDao代表“剪刀”、Bu代表“布”。End代表输入结束,这一行不要作为出招处理。

输出格式:

对每一个输入的出招,按要求输出稳赢或平局的招式。每招占一行。

代码实现


#include <stdio.h>

int main() {
    int k;
    scanf("%d",&k);
    char move[10];
    int count=0;
    while(1){
        scanf("%s",&move);
        if(move[0]=='E'&&move[1]=='n'&&move[2]=='d'){
            break;
        }
        //间隔次数达到,平局 
        if(count==k){
            printf("%s\n",move);
            count=0;
        }else if(move[0]=='C'){
            printf("Bu\n");count++;
        }else if(move[0]=='J'){
            printf("ChuiZi\n");count++;
        }else if(move[0]=='B'){
            printf("JianDao\n");count++;
        }
    }
    return 0;
}

L1-045 宇宙无敌大招呼

据说所有程序员学习的第一个程序都是在屏幕上输出一句“Hello World”,跟这个世界打个招呼。作为天梯赛中的程序员,你写的程序得高级一点,要能跟任意指定的星球打招呼。

代码实现

#include <stdio.h>

int main() {
    char s[100];
    scanf("%s",&s);
    printf("Hello %s",s);
    return 0;
}

L1-046 整除光棍**

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:

输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:

在一行中输出相应的最小的sn,其间以1个空格分隔。

思路实现:

依次遍历找到这个光棍数,光棍数对x取余等于0,但难点在于,光棍数可能是个非常大的数,会造成溢出,考虑模拟我们人工计算除法的过程,手工除,如果不够除进位+1

代码实现

#include<stdio.h>
int main()
{
    int x = 0;
    scanf("%d",&x);
    int n = 1;
    int count = 1;
    //找出首个比x大的光棍数 
    while(n<x)
    {
        n=n*10+1;
        count++;
    }
    while(1)
    {
        printf("%d",n/x);
        n=n%x;
        if(n==0)
        {
            break;
        }
        else
        {
            n=n*10+1;
            count++;
        }
    }
    printf(" %d",count);
    return 0;
}

L1-047 装睡

你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们中间有可能在装睡的人,即至少一项指标不在正常范围内的人。

代码实现

#include <stdio.h>

typedef struct student{
    char name[10];
    int pl;
    int mb;
}student;

int main() {
    int n;
    scanf("%d",&n);
    student s[n];
    for(int i=0;i<n;i++){
        scanf("%s %d %d",&s[i].name,&s[i].pl,&s[i].mb);
        if(s[i].pl<15||s[i].pl>20||s[i].mb<50||s[i].mb>70){
            printf("%s\n",s[i].name);
        }
    }
    return 0;
}

L1-048 矩阵A乘以B*

给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列,B有Rb​行、Cb​列,则只有Ca​与Rb​相等时,两个矩阵才能相乘。

输入格式:

输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式:

若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

输入样例1:

2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8

输出样例1:

2 4
20 22 24 16
53 58 63 28

实现思路

三个for循环,行列相乘再相加 

代码实现

#include<stdio.h> 
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    int num1[a][b];
    for(int i=0;i<a;i++){
        for(int j=0;j<b;j++){
            scanf("%d",&num1[i][j]);
        }
    }
    int c,d;
    scanf("%d %d",&c,&d);
    int num2[c][d];
    for(int i=0;i<c;i++){
        for(int j=0;j<d;j++){
            scanf("%d",&num2[i][j]);
        }
    }
    if(b!=c) printf("Error: %d != %d",b,c);
    else{
        printf("%d %d\n",a,d);
        int num3[a][d]; 
        for(int i=0;i<a;i++){
            for(int j=0;j<d;j++){
                num3[i][j]=0;
                //行列相乘再相加 
                for(int k=0;k<b;k++){
                    num3[i][j]+=num1[i][k]*num2[k][j];
                }
                if(j<d-1)
                printf("%d ",num3[i][j]);
                else
                printf("%d",num3[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

L1-049 天梯赛座位分配**

天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。

输入格式:

输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。

输出格式:

从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号X,从 1 开始。

代码实现

#include <stdio.h>
#include <string.h>
int main()
{
    int n = 0;
    scanf("%d",&n);
    const int N = 106;
    int arr[N];
    for(int i = 1;i<=n;i++)
        scanf("%d",&arr[i]);
    for(int i = 1;i<=n;i++)//第几个学校
    {
        
        printf("#%d\n",i);
        int count = 0;//每个学校排了几个人
        int n1 = 2;//注意一个学校的情况
        if(n>=2)
            n1 = n;//可以理解为一次性排几个座位
        int q = i;//当前学校的队员的座位号
        for(int j = 1;j<=arr[i];j++)//当前学校的队伍数
        {
            int flag = 0;
            for(int k = 1;k<=10;k++)//一个队伍10人
            {
                if(flag)
                    printf(" ");
                flag = 1;
                printf("%d",q);
                count++;//每个学校排了几个人
                if(count%10==0)
                {//可以优化,count%10==0才进入循环,(优化后发的,也可以去掉if)
                    for(int o = 1;o<i;o++)//看前面学校是否有排完的
                    {
                        if(count==arr[o]*10 && n1>2)
                            n1--;//排的座位数-1
                    }
                }
                q+=n1;//该学校下一个队员的座位号
                if(count%10==0)
                {
                    for(int o = i+1;o<=n;o++)//看后面学校是否有排完的
                    {
                        if(count==(arr[o]*10) && n1>2)
                            n1--;//排的座位数-1
                    }
                }
            }
            printf("\n");
        }
    }
    return 0;
}

L1-050 倒数第N个字符串

给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, ..., aaz, aba, abb, ..., abz, ..., zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。

代码实现

#include <stdio.h>

int main() {
    int l, n, sum = 1, index = 0;
    scanf("%d %d", &l, &n);
    char map[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    for(int i = 0; i < l; i++) {
        sum *= 26;
    }
    index = sum - n; // 正确的计算索引
    char res[l];int q = 0;
    for(q=0;q<l;q++){
        res[q]=map[index%26];
        index/=26;
    }
    for(int i = q - 1; i >= 0; i--) {
        printf("%c", res[i]);
    }
    return 0;
}

L1-051 打折

去商场淘打折商品时,计算打折以后的价钱是件颇费脑子的事情。例如原价 ¥988,标明打 7 折,则折扣价应该是 ¥988 x 70% = ¥691.60。本题就请你写个程序替客户计算折扣价。

代码实现

#include <stdio.h>

int main()
{
    double n;
    int m;
    scanf("%lf %d",&n,&m);
    n=n*m*0.1;
    printf("%.2lf",n);
    return 0;
}

L1-052 2018我们要赢

2018年天梯赛的注册邀请码是“2018wmyy”,意思就是“2018我们要赢”。本题就请你用汉语拼音输出这句话。

代码实现

#include <stdio.h>

int main()
{
    printf("2018\n");
    printf("wo3 men2 yao4 ying2 !");
    return 0;
}

L1-053 电子汪

据说汪星人的智商能达到人类 4 岁儿童的水平,更有些聪明汪会做加法计算。比如你在地上放两堆小球,分别有 1 只球和 2 只球,聪明汪就会用“汪!汪!汪!”表示 1 加 2 的结果是 3。

本题要求你为电子宠物汪做一个模拟程序,根据电子眼识别出的两堆小球的个数,计算出和,并且用汪星人的叫声给出答案。

代码实现

#include <stdio.h>

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    for(int i=0;i<(a+b);i++)
    printf("Wang!");
    return 0;
}

L1-054 福到了*

“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @ 或者为空格。而倒过来的汉字所用的字符由裁判指定。

输入格式:

输入在第一行中给出倒过来的汉字所用的字符、以及网格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N 行,每行给出 N 个字符,或者为 @ 或者为空格。

输出格式:

输出倒置的网格,如样例所示。但是,如果这个字正过来倒过去是一样的,就先输出bu yong dao le,然后再用输入指定的字符将其输出。

实现思路

用二维数组进行输入,用输入的字符替代数组里的字符,判断倒过来是否相同,逆向输出

代码实现

#include <stdio.h>
#include <string.h>
int main()
{   
    //输入 
    char c;int n;
    scanf("%c %d",&c,&n);
    getchar();
    char num[n+1][n+1];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf("%c",&num[i][j]);
        }
        getchar();
    }
    int flag=1;
    //判断正过来和倒过去是否一样
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(num[i][j]!=num[n-i+1][n-j+1]) flag=0;
        }
    }
    //输出 
    if(flag==1) printf("bu yong dao le\n");
    for(int i=n;i>=1;i--){
        for(int j=n;j>=1;j--){
            if(num[i][j]!=' '){
                num[i][j]=c;
            }
            printf("%c",num[i][j]);
        }
        printf("\n");
    }
    return 0;
}

L1-055 谁是赢家

某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定。规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出;或艺人的观众票数低,但得到全部评委的认可,也可以胜出。节目保证投票的观众人数为奇数,所以不存在平票的情况。本题就请你用程序判断谁是赢家。

代码实现

#include <stdio.h>

int main()
{
    int a,b,counta=0,countb=0;
    scanf("%d %d",&a,&b);
    getchar();
    int c[3];
    for(int i=0;i<3;i++){
        scanf("%d",&c[i]);
        if(c[i]==0) counta++;
        if(c[i]==1) countb++;
    }
    if(a>b&&counta>0){
        printf("The winner is a: %d + %d",a,counta);
    }else if(a<b&&countb>0){
        printf("The winner is b: %d + %d",b,countb);
    }else if(counta==3){
        printf("The winner is a: %d + %d",a,counta);
    }else if(countb==3){
        printf("The winner is b: %d + %d",b,countb);
    }
    return 0;
}

L1-056 猜数字

一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。

代码实现

#include <stdio.h>
#include <math.h>

typedef struct person {
    char name[10];
    int num;
} person;

int main() {
    int n;
    scanf("%d", &n);
    person s[n];
    double sum = 0;
    for (int i = 0; i < n; i++) {
        scanf("%s %d", &s[i].name, &s[i].num);
        sum += s[i].num;
    }
    double res = sum / n / 2;
    double temp;
    int j, index = 0; // 初始化index变量
    int min = fabs(s[0].num - res);
    for (j = 1; j < n; j++) {
        temp = fabs(s[j].num - res);
        if (min > temp) {
            min = temp;
            index = j;
        }
    }
    printf("%.0lf %s", res, s[index].name);
    return 0;
}

L1-057 PTA使我精神焕发

代码实现

#include <stdio.h>

int main()
{
    printf("PTA shi3 wo3 jing1 shen2 huan4 fa1 !");
    return 0;
}

L1-058 6翻了*

“666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!

本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。

输入格式:

输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。

输出格式:

从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。

实现思路

遍历字符串,有连续的6就进行计数,有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。没有的话回退,正常输出

代码实现

#include <stdio.h>

int main()
{   
    char s[1001];
    int index=0;
    while((s[index]=getchar())!='\n'){
        index++;
    }
    for(int i=0;i<index;i++){
        int count=0;
        while(s[i]=='6'){
            count++;
            i++;
        }
        if(count<=3) i-=count;
        if(count>3&&count<=9) {printf("9");i--;}
        else if(count>9) {printf("27");i--;}
        else printf("%c",s[i]);
    }   
    return 0;
}

L1-059 敲笨钟

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。

现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。

代码实现

#include <stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        char num[100]={0};int j=0;
        getchar();//消耗换行符 
        while((num[j]=getchar())!='.'){
            j++;
        }
        int flag=0;
        for(int p=0;p<j;p++){
            if(num[p]==','){
                if(num[p-3]=='o'&&num[p-2]=='n'&&num[p-1]=='g'){
                    flag++;
                }
            }
            if(p==j-1){
                if(num[p-2]=='o'&&num[p-1]=='n'&&num[p]=='g'){
                    flag++;
                }
            }
        }
        if(flag!=2){
            printf("Skipped\n");
        }else{
            int count=0,temp;
            for(int p=j-1;p>0;p--){
              if(num[p]==' ')count++;
              if(count==3){
                  temp=p;
                  for(int q=0;q<temp;q++){
                      printf("%c",num[q]);
                  }
                  printf(" qiao ben zhong");break;
              }
            }
            printf(".\n");
        }
    }
    return 0;
}

L1-060 心理阴影面积

这是一幅心理阴影面积图。我们都以为自己可以匀速前进(图中蓝色直线),而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工(图中的红色折线)。由红、蓝线围出的面积,就是我们在做作业时的心理阴影面积。

现给出红色拐点的坐标 (x,y),要求你算出这个心理阴影面积。

代码实现

#include <stdio.h>

int main()
{
    int x,y;
    scanf("%d %d",&x,&y);
    int sum=y*100/2+(100-x)*100/2;
    printf("%d",5000-sum);   
    return 0;
}

L1-061 新胖子公式

根据钱江晚报官方微博的报导,最新的肥胖计算方法为:体重(kg) / 身高(m) 的平方。如果超过 25,你就是胖子。于是本题就请你编写程序自动判断一个人到底算不算胖子。

代码实现

#include <stdio.h>

int main()
{
    double height,weight;
    scanf("%lf %lf",&weight,&height);
    double res=weight/height/height;
    if(res>25){
        printf("%.1lf\n",res);
        printf("PANG");
    }else{
        printf("%.1lf\n",res);
        printf("Hai Xing");
    }
    return 0;
}

L1-062 幸运彩票

彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。

代码实现

#include <stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        char num[6];
        scanf("%s",&num);
        int leftsum=0,rightsum=0;
        for(int j=0;j<6;j++){
            if(j<3) leftsum+=num[j]+'0';
            else rightsum+=num[j]+'0';
        } 
        if(leftsum==rightsum)
        printf("You are lucky!\n");
        else
        printf("Wish you good luck.\n");
    }
    return 0;
}

L1-063 吃鱼还是吃肉

国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。

现在你要根据小宝宝的身高体重,给出补充营养的建议。

代码实现

#include <stdio.h>

typedef struct baby{
    int sex;
    int height;
    int weight;
}baby;

int main()
{
    int n;
    scanf("%d",&n);
    baby s[n];
    for(int i=0;i<n;i++){
        scanf("%d %d %d",&s[i].sex,&s[i].height,&s[i].weight);
        if(s[i].sex==0){
            if(s[i].height>129){
                printf("ni li hai! ");
            }else if(s[i].height==129){
                 printf("wan mei! ");
            }else{
                printf("duo chi yu! ");
            }
            if(s[i].weight>25){
                printf("shao chi rou!");
            }else if(s[i].weight==25){
                 printf("wan mei!");
            }else{
                printf("duo chi rou!");
            }
        }else{
            if(s[i].height>130){
                printf("ni li hai! ");
            }else if(s[i].height==130){
                 printf("wan mei! ");
            }else{
                printf("duo chi yu! ");
            }
            if(s[i].weight>27){
                printf("shao chi rou!");
            }else if(s[i].weight==27){
                 printf("wan mei!");
            }else{
                printf("duo chi rou!");
            }
        }
        printf("\n");
    }
    return 0;
}

L1-064 估值一亿的AI核心代码**

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;
  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
  • 把原文中所有大写英文字母变成小写,除了 I
  • 把原文中所有独立的 can youcould you 对应地换成 I canI could—— 这里“独立”是指被空格或标点符号分隔开的单词;
  • 把原文中所有独立的 I 和 me 换成 you
  • 把原文中所有的问号 ? 换成惊叹号 !
  • 在一行中输出替换后的句子作为 AI 的回答。

输入格式:

输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。

输出格式:

按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。

代码实现(本题不建议用c语言实现)

#include <stdio.h>
#include <string.h>
void empty(char zf1[]);//多余空格打上标记
void smellchar(char zf1[]);//转小写
void change(char zf1[]);//给特殊字符串打上标记
void findI(char zf[]);//给I和me打上标记
void zfcpy(char zf1[],char zf2[]);//复制字符串并去除多余空格
int is_zm(char zf);//判断zf是不是字母和数字,即判断是否是空格或标点
void printzf(char zf[]);//把特殊标记后的字符串转化成题目需要的
 
int main(){
    int num;
    scanf("%d",&num);
    getchar();
    char zf1[1001],zf2[1001];
    while(num--){
        gets(zf1);
        printf("%s\n",zf1);
        empty(zf1);
        smellchar(zf1);
        zfcpy(zf1,zf2);
        findI(zf2);
        change(zf2);
        smellchar(zf2);
        printf("AI:");
        printzf(zf2);
    }
}
//判断传入的字符是否为字母或者数字
int is_zm(char zf){
    if(zf>='a'&&zf<='z'||zf>='A'&&zf<='Z'||zf>='0'&&zf<='9'){
        return 0;
    }else{
        return 1;
    }
}
//消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
void empty(char zf1[]){
    int i=0,len=strlen(zf1);
    while(zf1[i]==' '){
        zf1[i]='#';
        i++;
    }
    i=len-1;
    while(zf1[i]==' '){
        zf1[i]='#';
        i--;
    }
    for(i=0;i<len;i++){
        if(zf1[i]==' '&&zf1[i]==zf1[i+1]){
            zf1[i]='#';
        }
        if(i!=0&&zf1[i-1]==' ' &&is_zm(zf1[i])){
            zf1[i-1]='#';
        }
    }
}
 
//把原文中所有大写英文字母变成小写,除了 I;
void smellchar(char zf1[]){
    int i=0;
    while(zf1[i]!='\0'){
        if(zf1[i]!='I'&&zf1[i]<='Z'&&zf1[i]>='A'){
            zf1[i]=zf1[i]-'A'+'a';
        }
        i++;
    }
}
//把原文中所有独立的 I 和 me 换成 you;
void findI(char zf[]){
    int i=0;
    while(zf[i]!='\0'){
        if(zf[i]=='I'&&is_zm(zf[i-1])&&is_zm(zf[i+1])){
            zf[i]='&';
        }
        if(zf[i]=='m'&&zf[i+1]=='e'&&is_zm(zf[i-1])&&is_zm(zf[i+2])){
            zf[i]='@';
        }
        i++;
    }
}
//把字符串一去掉多余空格之后传给字符串2
void zfcpy(char zf1[],char zf2[]){
    int i=0,j=1;
    zf2[0]=' ';//第一个位置都放空格方便后续处理(不再需要把首字符特殊化处理)
    while(zf1[i]!='\0'){
        if(zf1[i]!='#'){
            zf2[j]=zf1[i];
            j++;
        }
        i++;
    }
    zf2[j]='\0';
}
//把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
void change(char zf1[]){
    char *p=NULL;
    
    while(1){
    p=strstr(zf1,"can you");//一句话中可能不止一个can you 和could you (测试点4)
    if(p==NULL){
        break;
    }else if(is_zm(*(p-1))&&is_zm(*(p+7))){
        *p='%';
    }else{
        *p='C';//出现ccan you 时防止误判,防止死循环
    }
    p=NULL;
    }
    
    while(1){
        p=strstr(zf1,"could you");//一句话中可能不止一个can you 和could you (测试点4)
        if(p==NULL){
            break;
        }else if(is_zm(*(p-1))&&is_zm(*(p+9))){
            *p='#';
        }else{
            *p='C';
        }
        p=NULL;
    }
}
 
//将原文中做了标记的点转化为对于字符串
//在一行中输出替换后的句子作为 AI 的回答。
void printzf(char zf[]){
    int i=0;
    while (zf[i]!='\0'){
        if(zf[i]=='&'){
            printf("you");
            i++;
        } else if(zf[i]=='@'){
            printf("you");
            i=i+2;
        } else if(zf[i]=='%'){
            printf("I can");
            i=i+7;
        } else if(zf[i]=='#'){
            printf("I could");
            i+=9;
            //把原文中所有的问号 ? 换成惊叹号 !;
        } else if(zf[i]=='?'){
            printf("!");
            i++;
        } else{
            printf("%c",zf[i]);
            i++;
        }
    }
    printf("\n");
}

L1-065 嫑废话上代码

Linux 之父 Linus Torvalds 的名言是:“Talk is cheap. Show me the code.”(嫑废话,上代码)。本题就请你直接在屏幕上输出这句话。

代码实现

#include <stdio.h>

int main()
{
   
    printf("Talk is cheap. Show me the code.");
    return 0;
}

L1-066 猫是液体

测量一个人的体积是很难的,但猫就不一样了。因为猫是液体,所以可以很容易地通过测量一个长方体容器的容积来得到容器里猫的体积。本题就请你完成这个计算。

代码实现

#include <stdio.h>

int main()
{
    int z,k,g;
    scanf("%d %d %d",&z,&k,&g);
    int res=z*k*g;
    printf("%d",res);
    return 0;
}

L1-067 洛希极限

洛希极限(Roche limit)是一个天体自身的引力与第二个天体造成的潮汐力相等时的距离。当两个天体的距离少于洛希极限,天体就会倾向碎散,继而成为第二个天体的环。它以首位计算这个极限的人爱德华·洛希命名。(摘自百度百科)

大天体密度与小天体的密度的比值开 3 次方后,再乘以大天体的半径以及一个倍数(流体对应的倍数是 2.455,刚体对应的倍数是 1.26),就是洛希极限的值。例如木星与地球的密度比值开 3 次方是 0.622,如果假设地球是流体,那么洛希极限就是 0.622×2.455=1.52701 倍木星半径;但地球是刚体,对应的洛希极限是 0.622×1.26=0.78372 倍木星半径,这个距离比木星半径小,即只有当地球位于木星内部的时候才会被撕碎,换言之,就是地球不可能被撕碎。

本题就请你判断一个小天体会不会被一个大天体撕碎。

代码实现

#include<stdio.h>
int main()
{
    double a,b,c;
    scanf("%lf %lf %lf",&a,&b,&c);
    double res=1.0;
    res=res*a;
    if(b==0)
    res*=2.455;
    if(b==1)
    res*=1.26;
    res=res/c;
    if(res>1)
    printf("%.2lf T_T",res*c);
    else
    printf("%.2lf ^_^",res*c);
    return 0;
}

L1-068 调和平均

N 个正数的算数平均是这些数的和除以 N,它们的调和平均是它们倒数的算数平均的倒数。本题就请你计算给定的一系列正数的调和平均值。

代码实现

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    double num[n];
    double sum=0;
    for(int i=0;i<n;i++){
        scanf("%lf",&num[i]);
        sum+=(1/num[i]);
    }
    sum=sum/n;
    printf("%.2lf",1/sum);
    return 0;
}

L1-069 胎压监测

让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序,随时监测四轮的胎压,并给出正确的报警信息。报警规则如下:

  • 如果所有轮胎的压力值与它们中的最大值误差在一个给定阈值内,并且都不低于系统设定的最低报警胎压,则说明情况正常,不报警;
  • 如果存在一个轮胎的压力值与它们中的最大值误差超过了阈值,或者低于系统设定的最低报警胎压,则不仅要报警,而且要给出可能漏气的轮胎的准确位置;
  • 如果存在两个或两个以上轮胎的压力值与它们中的最大值误差超过了阈值,或者低于系统设定的最低报警胎压,则报警要求检查所有轮胎。

代码实现

#include<stdio.h>

int main()
{
    int num[6];
    for(int i=0;i<6;i++){
        scanf("%d",&num[i]);    
    }
    int sum=0;//有问题的轮子数
    int index;//有问题的轮子的索引 
    int max=num[0];
    for(int i=0;i<4;i++){  
        if(num[i]<num[4]){
            sum++;
            index=i;
        }
        if(max<num[i]) max=num[i];
    }
    for(int j=0;j<4;j++){
        if((max-num[j])>num[5]){
            sum++;
            index=j;
        }
    }
    if(sum==0){
        printf("Normal");
    }else if(sum==1){
        printf("Warning: please check #%d!",index+1);
    }else{
        printf("Warning: please check all the tires!");
    }
}

L1-070 吃火锅

以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。

本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1

代码实现

#include <stdio.h>
#include <string.h>
int main()
{
    char ch[1000]={0};
    char ch1[15]="chi1 huo3 guo1";
    int count = 0,zz = 100,sum = 0;
    for(int i = 0;i<100000;i++)//注意这里的100000,或者用while循环也行
    {
        gets(ch);
        count++;
        if(ch[0]=='.' && strlen(ch) == 1)
            break;
        if(strstr(ch,ch1)!=NULL)
        {
            sum++;
            if(i<zz)
                zz = i;
        }
    }
    count--;
    zz++;//这里要加一,i是从0开始的
    printf("%d\n",count);
    if(sum==0)
        printf("-_-#\n");
    else
        printf("%d %d\n",zz,sum);
    return 0;
}

L1-071 前世档案

网络世界中时常会遇到这类滑稽的算命小程序,实现原理很简单,随便设计几个问题,根据玩家对每个问题的回答选择一条判断树中的路径(如下图所示),结论就是路径终点对应的那个结点。

path.jpg

现在我们把结论从左到右顺序编号,编号从 1 开始。这里假设回答都是简单的“是”或“否”,又假设回答“是”对应向左的路径,回答“否”对应向右的路径。给定玩家的一系列回答,请你返回其得到的结论的编号。

代码实现

#include <stdio.h>

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    int sum=1,num=0,index=0;
    for(int i=0;i<n;i++){
        if(i==0) index=1;
        else     index*=2;
        num+=index;
    }
    for(int i=0;i<m;i++){
        char que[n+1];
        for(int j=0;j<n;j++){
            scanf(" %c",&que[j]);
            if(que[j]=='y'){
               sum*=2; 
            }else{
               sum=sum*2+1;
            }
        }
        printf("%d\n",sum-num);
        sum=1;
    }
    return 0;
}

L1-072 刮刮彩票

每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9,数字各不重复,并以 3×3 的“九宫格”形式排布在彩票上。

在游戏开始时能看见一个位置上的数字,其他位置上的数字均不可见。你可以选择三个位置的数字刮开,这样玩家就能看见四个位置上的数字了。最后玩家再从 3 横、3 竖、2 斜共 8 个方向中挑选一个方向,方向上三个数字的和可根据下列表格进行兑奖,获得对应数额的金币。

代码实现

#include <stdio.h>

int main()
{
    int num[3][3],total=0;
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            scanf("%d",&num[i][j]);
            total+=num[i][j];
        }
    }
    //计算0代表的数字 
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(num[i][j]==0){
                num[i][j]=45-total;
            }
        }
    }
    int x[3],y[3];
    for(int q=0;q<3;q++){
        scanf("%d %d",&x[q],&y[q]);
        int line=x[q]-1,row=y[q]-1;
        printf("%d\n",num[line][row]);
    }
    int dir,sum=0;
    scanf("%d",&dir);
    int map[]={10000,36,720,360,80,252,108,72,54,180,72,180,119,36,306,1080,144,1800,3600};
    switch(dir){
        case 1:sum=num[0][0]+num[0][1]+num[0][2];break;
        case 2:sum=num[1][0]+num[1][1]+num[1][2];break;
        case 3:sum=num[2][0]+num[2][1]+num[2][2];break;
        case 4:sum=num[0][0]+num[1][0]+num[2][0];break;
        case 5:sum=num[0][1]+num[1][1]+num[2][1];break;
        case 6:sum=num[0][2]+num[1][2]+num[2][2];break;
        case 7:sum=num[0][0]+num[1][1]+num[2][2];break;
        case 8:sum=num[0][2]+num[1][1]+num[2][0];break;
    }
    printf("%d",map[sum-6]);            
    return 0;
}

L1-073 人与神

跨界大神 L. Peter Deutsch 有一句名言:“To iterate is human, to recurse divine.”(迭代的是人,递归的是神)。本题就请你直接在屏幕上输出这句话。

代码实现

#include<stdio.h>
int main(){
    printf("To iterate is human, to recurse divine.");
}

L1-074 两小时学完C语言

知乎上有个宝宝问:“两个小时内如何学完 C 语言?”当然,问的是“学完”并不是“学会”。

假设一本 C 语言教科书有 N 个字,这个宝宝每分钟能看 K 个字,看了 M 分钟。还剩多少字没有看?

代码实现

#include <stdio.h>

int main()
{
    int n,k,m;
    scanf("%d %d %d",&n,&k,&m);
    int res=n-k*m;
    printf("%d",res);          
    return 0;
}

L1-075 强迫症

小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808。有强迫症的小强请你写个程序,把所有人的出生年月都整理成 年年年年-月月 格式。对于那些只写了年份后两位的信息,我们默认小于 22 都是 20 开头的,其他都是 19 开头的。

代码实现

#include <stdio.h>
#include <string.h>

int main()
{
    char birth[10]={0};
    scanf("%s",birth);
    if(strlen(birth)==4){
        for(int i=0;i<4;i++) {
            birth[i]=birth[i]-'0';
        }
        int year=birth[0]*10+birth[1];
        if(year<22) {
            printf("20");
            printf("%d%d-%d%d",birth[0],birth[1],birth[2],birth[3]);
        }
        else {
            printf("19");
            printf("%d%d-%d%d",birth[0],birth[1],birth[2],birth[3]);
        }
    }else{
        for(int i=0;i<6;i++) {
            birth[i]=birth[i]-'0';
        }
        printf("%d%d%d%d-%d%d",birth[0],birth[1],birth[2],birth[3],birth[4],birth[5]);
    }
    return 0;
}

L1-076 降价提醒机器人

小 T 想买一个玩具很久了,但价格有些高,他打算等便宜些再买。但天天盯着购物网站很麻烦,请你帮小 T 写一个降价提醒机器人,当玩具的当前价格比他设定的价格便宜时发出提醒。

代码实现

#include <stdio.h>
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    double num[100]={0};
    for(int i=0;i<n;i++){
        scanf("%lf",&num[i]);
        if(num[i]<m) printf("On Sale! %.1lf\n",num[i]);
    } 
    return 0;
}

L1-077 大笨钟的心情

有网友问:未来还会有更多大笨钟题吗?笨钟回复说:看心情……

本题就请你替大笨钟写一个程序,根据心情自动输出回答。

代码实现

#include <stdio.h>

int main()
{
    int mood[24];
    for(int i=0;i<24;i++){
        scanf("%d",&mood[i]);
    }
    while(1){
        int time;
        scanf("%d",&time);
        if(time<0||time>23){
            break;
        }else{
            if(mood[time]>50) printf("%d Yes\n",mood[time]);
            else printf("%d No\n",mood[time]);
        }
    }
    return 0;
}

L1-078 吉老师的回归

曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦!

为了简化题目,我们不妨假设天梯赛的每道题目可以用一个不超过 500 的、只包括可打印符号的字符串描述出来,如:Problem A: Print "Hello world!"

众所周知,吉老师的竞赛水平非常高超,你可以认为他每道题目都会做(事实上也是……)。因此,吉老师会按照顺序看题并做题。但吉老师水平太高了,所以签到题他就懒得做了(浪费时间),具体来说,假如题目的字符串里有 qiandao 或者 easy(区分大小写)的话,吉老师看完题目就会跳过这道题目不做。

现在给定这次天梯赛总共有几道题目以及吉老师已经做完了几道题目,请你告诉大家吉老师现在正在做哪个题,或者吉老师已经把所有他打算做的题目做完了。

提醒:天梯赛有分数升级的规则,如果不做签到题可能导致团队总分不足以升级,一般的选手请千万不要学习吉老师的酷炫行为!

代码实现

#include <stdio.h>
#include <string.h>

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    getchar();  
    char flag1[]="qiandao";
    char flag2[]="easy";
    char ques[40][50];
    for(int i=0;i<n;i++){
         gets(ques[i]);
        if((strstr(ques[i],flag1)!=NULL)){
            continue;
        }  
        if((strstr(ques[i],flag2)!=NULL)){
            continue;
        }    
        m--;
        if(m<0) puts(ques[i]); 
    }
    if(m>=0){
        printf("Wo AK le");
    }
    return 0;
}

L1-079 天梯赛的善良

天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分。

于是命题组首先将编程能力划分成了 106 个等级(太疯狂了,这是假的),然后调查了每个参赛学生的编程能力。现在请你写个程序找出所有参赛学生的最小和最大能力值,给命题组作为出题的参考。

代码实现

#include <stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    int num[20000]={0};
    int min=1000000,max=0;
    for(int i=0;i<n;i++){
        scanf("%d",&num[i]);
        if(max<num[i]) max=num[i];
        if(min>num[i]) min=num[i];
    }
    int countmin=0,countmax=0;
    for(int j=0;j<n;j++){
        if(num[j]==max)countmax++;
        if(num[j]==min)countmin++;
    }
    printf("%d %d\n",min,countmin);
    printf("%d %d\n",max,countmax);
    return 0;
}

L1-080 乘法口诀数列

本题要求你从任意给定的两个 1 位数字 a1​ 和 a2​ 开始,用乘法口诀生成一个数列 {an​},规则为从 a1​ 开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是 1 位数,则其每一位都应成为数列的一项。

代码实现

#include <stdio.h>

int main()
{
    int a1,a2,n;
    scanf("%d %d %d",&a1,&a2,&n);
    int num[1000];
    num[0]=a1,num[1]=a2;
    int index=2;
    for(int i=2;i<n;i++){
        num[i]=num[index-1]*num[index-2];   
        if(num[i]>=10){
            num[i+1]=num[i]%10;
            num[i]=num[i]/10;
            i++;    
        }
        index++;
    }
    for(int j=0;j<n-1;j++){
        printf("%d ",num[j]);
    }
    printf("%d",num[n-1]);
    return 0;
}

L1-081 今天我要赢

2018 年我们曾经出过一题,是输出“2018 我们要赢”。今年是 2022 年,你要输出的句子变成了“我要赢!就在今天!”然后以比赛当天的日期落款。

代码实现

#include <stdio.h>

int main()
{
    printf("I'm gonna win! Today!\n");
    printf("2022-04-23");
    return 0;
}

L1-082 种钻石

2019年10月29日,中央电视台专题报道,中国科学院在培育钻石领域,取得科技突破。科学家们用金刚石的籽晶片作为种子,利用甲烷气体在能量作用下形成碳的等离子体,慢慢地沉积到钻石种子上,一周“种”出了一颗 1 克拉大小的钻石。

本题给出钻石的需求量和人工培育钻石的速度,请你计算出货需要的时间。

代码实现

#include <stdio.h>

int main()
{
    int n,v;
    scanf("%d %d",&n,&v);
    printf("%d",n/v);
    return 0;
}

L1-083 谁能进图书馆

为了保障安静的阅读环境,有些公共图书馆对儿童入馆做出了限制。例如“12 岁以下儿童禁止入馆,除非有 18 岁以上(包括 18 岁)的成人陪同”。现在有两位小/大朋友跑来问你,他们能不能进去?请你写个程序自动给他们一个回复。

代码实现

#include <stdio.h>

int main()
{
    int low,pass,chl1,chl2;
    scanf("%d %d %d %d",&low,&pass,&chl1,&chl2);
    if(chl1<low&&chl2<low) {
        printf("%d-N %d-N\n",chl1,chl2);
        printf("zhang da zai lai ba");
    }
    else if(chl1>=low&&chl2>=low){
        printf("%d-Y %d-Y\n",chl1,chl2);
        printf("huan ying ru guan");
    }
    else if(chl1>low&&chl1<pass&&chl2<low){
        printf("%d-Y %d-N\n",chl1,chl2);
        printf("%d: huan ying ru guan",1);
    }
    else if(chl2>low&&chl2<pass&&chl1<low){
        printf("%d-N %d-Y\n",chl1,chl2);
        printf("%d: huan ying ru guan",2);
    }else{
        printf("%d-Y %d-Y\n",chl1,chl2);
        if(chl1>chl2){
            printf("qing 1 zhao gu hao 2");
        }else{
            printf("qing 2 zhao gu hao 1");
        }
    }
    return 0;
}

L1-084 拯救外星人

你的外星人朋友不认得地球上的加减乘除符号,但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”,是从 1 到 N 的连乘积。所以当他不知道“5+7”等于多少时,如果你告诉他等于“12!”,他就写出了“479001600”这个答案。

本题就请你写程序模仿外星人的行为。

代码实现

#include <stdio.h>

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    int sum=1;
    for(int i=1;i<=a+b;i++){
        sum*=i;
    }
    printf("%d",sum);
    return 0;
}

L1-085 试试手气

我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:

  • 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
  • 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。

那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。

代码实现

#include <stdio.h>

int main()
{
    int num[6];
    for(int i=0;i<6;i++){
        scanf("%d",&num[i]);
    }
    int n;
    scanf("%d",&n);
    for(int i=0;i<6;i++){
        if(i<5){
            if(num[i]<7-n){
            printf("%d ",7-n);
        }else{
            printf("%d ",6-n);
        }
        }else{
            if(num[i]<7-n){
            printf("%d",7-n);
        }else{
            printf("%d",6-n);
        }
        }
    }
    return 0;
}

L1-086 斯德哥尔摩火车上的题*

上图是新浪微博上的一则趣闻,是瑞典斯德哥尔摩火车上的一道题,看上去是段伪代码:

s = ''
a = '1112031584'
for (i = 1; i < length(a); i++) {
  if (a[i] % 2 == a[i-1] % 2) {
    s += max(a[i], a[i-1])
  }
}
goto_url('www.multisoft.se/' + s)

其中字符串的 + 操作是连接两个字符串的意思。所以这道题其实是让大家访问网站 www.multisoft.se/112358注意:比赛中千万不要访问这个网址!!!)。

当然,能通过上述算法得到 112358 的原始字符串 a 是不唯一的。本题就请你判断,两个给定的原始字符串,能否通过上述算法得到相同的输出?

输入格式:

输入为两行仅由数字组成的非空字符串,长度均不超过 104,以回车结束。

输出格式:

对两个字符串分别采用上述斯德哥尔摩火车上的算法进行处理。如果两个结果是一样的,则在一行中输出那个结果;否则分别输出各自对应的处理结果,每个占一行。题目保证输出结果不为空。

输入样例 1:

1112031584
011102315849

输出样例 1:

112358

输入样例 2:

111203158412334
12341112031584

输出样例 2:

1123583
112358

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int max(int a, int b){
    return a > b ? a : b;
}

char* toNum(char a[]){
    char *s = (char*)malloc(10001 * sizeof(char)); // 分配动态内存
    int index = 0;
    for (int i = 1; i < strlen(a); i++) {
        if (a[i] % 2 == a[i - 1] % 2){
            s[index] = max((int)a[i], (int)a[i - 1]);
            index++;
        }
    }
    return s;
}

int main(){
    char s1[10001], s2[10001];
    gets(s1);
    gets(s2); 
    char *a = toNum(s1);
    char *b = toNum(s2);
    if(strcmp(a, b) == 0){
        printf("%s", a);
    }else{
        printf("%s\n%s", a, b);
    }
    free(a); 
    free(b);
    return 0;
}

L1-087 机工士姆斯塔迪奥

在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。

你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。

给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。

代码实现

#include <stdio.h>

int main()
{
    int n,m,q;
    scanf("%d %d %d",&n,&m,&q);
    char num[n][m];
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++)
            num[i][j]=0;
    }
    for(int i=0;i<q;i++){
        int a,b;
        scanf("%d %d",&a,&b);
        //选择了一整行 
        if(a==0){
            for(int i=0;i<m;i++){
                num[b-1][i]++;
            }
        }
        //选择了一整列  
        else if(a==1){
            for(int i=0;i<n;i++){
                num[i][b-1]++;
            }
        }
    }
    int count=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(num[i][j]!=0){
                count++;
            }
        }
    }
    printf("%d",n*m-count);
    return 0;
}
    

L1-088 静静的推荐*

天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的:

  • 只考虑得分不低于 175 分的学生;
  • 一共接受 K 批次的推荐名单;
  • 同一批推荐名单上的学生的成绩原则上应严格递增;
  • 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。

给定全体参赛学生的成绩和他们的 PAT 考试成绩,请你帮静静姐算一算,她最多能向企业推荐多少学生?

输入样例:

10 2 90
203 0
169 91
175 88
175 0
175 90
189 0
189 0
189 95
189 89
256 100

输出样例:

8

样例解释:

第一批可以选择 175、189、203、256 这四个分数的学生各一名,此外 175 分 PAT 分数达到 90 分的学生和 189 分 PAT 分数达到 95 分的学生可以额外进入名单。第二批就只剩下 175、189 两个分数的学生各一名可以进入名单了。最终一共 8 人进入推荐名单。

代码实现

#include<stdio.h>
int main()
{
    int n,k,s;
    scanf("%d %d %d",&n,&k,&s); 
    int count = 0;
    int arr[291]={0};
    for(int i=0;i<n;i++)
    {
        int score=0,pat=0;//成绩
        scanf("%d %d",&score,&pat);
        if(score>=175)
        {
            if(pat>=s)
            {
                count++;
            }
            else if(arr[score]<k)
            {
                arr[score]++;
                count++;
            }
        }
    }
    printf("%d",count);
}

L1-089 最好的文档

有一位软件工程师说过一句很有道理的话:“Good code is its own best documentation.”(好代码本身就是最好的文档)。本题就请你直接在屏幕上输出这句话。

代码实现

#include<stdio.h>
int main(){
    printf("Good code is its own best documentation.");
}

L1-090 什么是机器学习

什么是机器学习?上图展示了一段面试官与“机器学习程序”的对话:

面试官:9 + 10 等于多少?
答:3
面试官:差远了,是19。
答:16
面试官:错了,是19。
答:18
面试官:不,是19。
答:19

本题就请你模仿这个“机器学习程序”的行为。

代码实现

#include<stdio.h>
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("%d\n",a+b-16);
    printf("%d\n",a+b-3);
    printf("%d\n",a+b-1);
    printf("%d\n",a+b);
}

L1-091 程序员买包子

这是一条检测真正程序员的段子:假如你被家人要求下班顺路买十只包子,如果看到卖西瓜的,买一只。那么你会在什么情况下只买一只包子回家?
本题要求你考虑这个段子的通用版:假如你被要求下班顺路买 N 只包子,如果看到卖 X 的,买 M 只。那么如果你最后买了 K 只包子回家,说明你看到卖 X 的没有呢?

代码实现

#include<stdio.h>
int main()
{
    int n,m,k;
    char x[100];
    scanf("%d %s %d %d",&n,&x,&m,&k);
    if(k==n){
        printf("mei you mai %s de",x); 
    }else if(k==m){
        printf("kan dao le mai %s de",x);
    }else{
        printf("wang le zhao mai %s de",x);
    }
}

L1-092 进化论

在“一年一度喜剧大赛”上有一部作品《进化论》,讲的是动物园两只猩猩进化的故事。猩猩吕严说自己已经进化了 9 年了,因为“三年又三年”。猩猩土豆指出“三年又三年是六年呐”……
本题给定两个数字,以及用这两个数字计算的结果,要求你根据结果判断,这是吕严算出来的,还是土豆算出来的。

代码实现

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int a,b,c;
        scanf("%d %d %d",&a,&b,&c);
        if(a+b==c){
            printf("Tu Dou\n");
        }else if(a*b==c){
            printf("Lv Yan\n");
        }else{
            printf("zhe du shi sha ya!\n");
        }
    }
}

L1-093 猜帽子游戏

宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子,有的是黑色的,有的是黄色的。每个人可以看到别人头上的帽子,但是看不到自己的。游戏开始后,每个人可以猜自己头上的帽子是什么颜色,或者可以弃权不猜。如果没有一个人猜错、并且至少有一个人猜对了,那么所有的宝宝共同获得一个大奖。如果所有人都不猜,或者只要有一个人猜错了,所有宝宝就都没有奖。
下面顺序给出一排帽子的颜色,假设每一群宝宝来玩的时候,都是按照这个顺序发帽子的。然后给出每一群宝宝们猜的结果,请你判断他们能不能得大奖。

代码实现

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int right[n];
    for(int i=0;i<n;i++){
        scanf("%d",&right[i]);
    }
    int k;
    scanf("%d",&k);
    for(int j=0;j<k;j++){
        int num[n];
        int flag1=0,flag2=0;
        for(int i=0;i<n;i++){
           scanf("%d",&num[i]);
           if(num[i]==0){
               flag1++;
           }else if(num[i]==right[i]){
               flag2++;
           }
        }
        if((flag1+flag2)==n&&flag1!=n){
            printf("Da Jiang!!!\n");
        }else{
            printf("Ai Ya\n");
        }
    }
}

L1-094 剪切粘贴(本题不建议使用c语言)**

使用计算机进行文本编辑时常见的功能是剪切功能(快捷键:Ctrl + X)。请实现一个简单的具有剪切和粘贴功能的文本编辑工具。

工具需要完成一系列剪切后粘贴的操作,每次操作分为两步:

  • 剪切:给定需操作的起始位置和结束位置,将当前字符串中起始位置到结束位置部分的字符串放入剪贴板中,并删除当前字符串对应位置的内容。例如,当前字符串为 abcdefg,起始位置为 3,结束位置为 5,则剪贴操作后, 剪贴板内容为 cde,操作后字符串变为 abfg。字符串位置从 1 开始编号。
  • 粘贴:给定插入位置的前后字符串,寻找到插入位置,将剪贴板内容插入到位置中,并清除剪贴板内容。例如,对于上面操作后的结果,给定插入位置前为 bf,插入位置后为 g,则插入后变为 abfcdeg。如找不到应该插入的位置,则直接将插入位置设置为字符串最后,仍然完成插入操作。查找字符串时区分大小写。

每次操作后的字符串即为新的当前字符串。在若干次操作后,请给出最后的编辑结果。

代码实现

#include<iostream>
using namespace std;
#include<string>
int main()
{
	string str;
	cin>>str;
	int n;
	cin>>n;
	while(n--)
	{		
		int x,y;
		string str1,str2;
		cin>>x>>y>>str1>>str2;
		string t=str.substr(x-1,y-x+1);
		str.erase(x-1,y-x+1);
		int pos=str.find(str1+str2);
		int pos2=str.find(str2);
		if(pos==-1)
		{
			str+=t;
		} 
		else
		{
			str=str.substr(0,pos+str1.length())+t+str.substr(pos2,str.length()-pos-str1.length());
		}
	}
	cout<<str;
	return 0;
}

L1-095 分寝室

学校新建了宿舍楼,共有 n 间寝室。等待分配的学生中,有女生 n0​ 位、男生 n1​ 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去,最后不能有寝室留空。
现请你写程序完成寝室的自动分配。分配规则如下:

  • 男女生不能混住;
  • 不允许单人住一间寝室;
  • 对每种性别的学生,每间寝室入住的人数都必须相同;例如不能出现一部分寝室住 2 位女生,一部分寝室住 3 位女生的情况。但女生寝室都是 2 人一间,男生寝室都是 3 人一间,则是允许的;
  • 在有多种分配方案满足前面三项要求的情况下,要求两种性别每间寝室入住的人数差最小。

代码实现

#include<stdio.h>
#include<math.h>

int main()
{
    int n0,n1,n;
    scanf("%d %d %d",&n0,&n1,&n);
    int flag=0,min=100000,man,woman;//0代表无解 
    for(int i=1;i<n&& i < n0 && (n-i)<n1;i++){
        int j=n-i;
        if(n0%i==0&&n1%j==0){
            flag=1;
            int temp=fabs(n0/i-n1/j);
            if(temp<min){
                min=temp;
                man=i,woman=j;
            }
        }
    }
    if(flag==0){
        printf("No Solution");
    }else{
        printf("%d %d",man,woman);
    }
}

L1-096 谁管谁叫爹

《咱俩谁管谁叫爹》是网上一首搞笑饶舌歌曲,来源于东北酒桌上的助兴游戏。现在我们把这个游戏的难度拔高一点,多耗一些智商。
不妨设游戏中的两个人为 A 和 B。游戏开始后,两人同时报出两个整数 NA​ 和 NB​。判断谁是爹的标准如下:

  • 将两个整数的各位数字分别相加,得到两个和 SA​ 和 SB​。如果 NA​ 正好是 SB​ 的整数倍,则 A 是爹;如果 NB​ 正好是 SA​ 的整数倍,则 B 是爹;
  • 如果两人同时满足、或同时不满足上述判定条件,则原始数字大的那个是爹。
    本题就请你写一个自动裁判程序,判定谁是爹。

代码实现

#include<stdio.h>

int sum(int a){
    int sum=0;
    while(a){
        sum+=a%10;
        a=a/10; 
    }
    return sum;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int a,b;
        scanf("%d %d",&a,&b);
        int sa=sum(a);
        int sb=sum(b);
        if(a%sb==0&&b%sa!=0){
            printf("A\n");
        }else if(a%sb!=0&&b%sa==0){
            printf("B\n");
        }else if(a%sb!=0&&b%sa!=0){
            if(a>b) printf("A\n");
            else printf("B\n");
        }else if(a%sb==0&&b%sa==0){
            if(a>b) printf("A\n");
            else printf("B\n");
        }
    }
}

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值