沧海竞舟热身赛I-题解

沧海竞舟热身赛I-题解

沧海竞舟热身赛一共10题,这是本人第一次尝试写题解,写得不好的地方,还请大家指正!谢谢!

1.有理数加法

本题要求编写程序,计算两个有理数的和。

输入格式:
输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

输出格式:
在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1:

1/3 1/6

输出样例1:

1/2

输入样例2:

4/3 2/3

输出样例2:

2

第一题水题,不过对于C语言基础不太好的朋友来说,有些需要注意的地方,想一想怎么约分,怎么进行分数的相加,然后注意输出格式就可以了。

#include<stdio.h>
int gcd(int a,int b){
             //约分函数
    if(a%b==0)
        return b;
    return gcd(b,a%b);
}
int main(){
   
    int a1,b1,a2,b2,a3,b3,p,q;
    scanf("%d/%d %d/%d",&a1,&b1,&a2,&b2);
    b3=b1*b2;
    a3=a1*b2+a2*b1;
    p=a3;
    q=b3;
    a3/=gcd(p,q);
    b3/=gcd(p,q);
    if(b3==1)                  //注意输出格式
        printf("%d",a3);
    else
        printf("%d/%d",a3,b3);
}

2.鸡兔同笼问题

输入两个整数代表鸡和兔的总只数与总脚数,编写程序,输出鸡和兔各多少只(输入和输出时,按先鸡后免的顺序,中间以空格分隔)。

输入格式:
两个不超过100000的非负整数,以空格分隔。

输出格式:
两个整数,以空格分隔,若输入数据无解,输出:-1 -1(表示无可能)。

输入样例1:

10 28

输出样例1:

6 4

输入样例2:

18 35

输出样例2:

-1 -1

差不多也算水题,只需要注意输入的合法性,就可以转换为经典的数学问题。

#include<stdio.h>
int main(){
   
    int a,b,c,d;
    scanf("%d %d",&a,&b);
    if(b%2!=0){
           //总腿数不能是奇数
        printf("-1 -1");
        return 0;
    }
    d=(b-2*a)/2;
    c=a-d;
    if(c<0||d<0){
          //总头数不能是负数
         printf("-1 -1");
        return 0;
    }
    else{
   
        printf("%d %d",c,d);
    }
}

3.数字菱形

输入一个0-9的数字和一个菱形的高度,编程输出这个菱形。

输入格式:
输入一个0-9的数字和一个菱形的高度(假定输入的高度为[3,33]内的奇数),两个整数间有空格分隔。

输出格式:
输出由指定数字开始绘制的指定高度的菱形。注意,编制菱形的数字是依次循环出现的,且整个菱形剧左显示(最宽的那一行,左边无空格)。

输入样例:

7 11

输出样例:

     7
    8 8
   9   9
  0     0
 1       1
2         2
 1       1
  0     0
   9   9
    8 8
     7

这题的题意非常易懂,不过调整输出格式就稍微有点麻烦了。看输出样例,我建议把菱形分成五部分输出:第1行,第2-5行,第6行,第7-10行,第11行。第一行,最后一行和最中间的一行特殊处理。容易发现,每行两个数之间的空格数(从第2行到第10行)为1,3,5,7,9,7,5,3,1.故用一个变量q可控制,在菱形上半部分,每行输出后让q+=2,在菱形下半部分,每行输出后让q-=2。最后还需要对菱形中的数字进行相应处理。

#include<stdio.h>
int main(){
   
    int n,k,p,q,flag=1;
    scanf("%d %d",&n,&k);
    p=k/2;        //想想为什么这么处理
    q=1;
    for(int i=1;i<=p;i++){
   
        if(flag)
            flag=0;
        else
            printf("\n");
        if(i==1){
          //首行特殊处理
            for(int j=1;j<=p;j++)
            printf(" ");
            printf("%d",n);
        }
        else{
   
            for(int j=1;j<=p-i+1;j++)
                printf(" ");
            printf("%d",n);
            for(int j=1;j<=q;j++)
                printf(" ");
            printf("%d",n);
            q+=2;
        }
        n++;
        n=n%10;     //保证n是个位数
    }
    
    printf("\n%d",n);
    for(int i=1;i<=q;i++)
        printf(" ");
    printf("%d",n)
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值