HNUCM_入门级题库 (练习2)【题解】

文章目录

    • A - Sorting Three Numbers
    • B - Circle in a Rectangle
    • C - Print Test Cases
    • D - Swapping Two Numbers
    • E - How Many Divisors?
    • F - A / B Problem


在这里插入图片描述

本次练习2题解更新有点慢了,望见谅~

注:本次练习或许有一些新的知识在里面,本篇不会全部概括,对于提及到的知识点可以百度查阅更加详细的博客学习

A - Sorting Three Numbers


题目大意

编写一个程序,读取三个整数,并按升序打印它们。


题解
HNUCM_入门级题库 (练习2)【题解】_第1张图片
需要用到排序算法,C语言版本给的是最基本的冒泡排序算法的模板 ,作为初学者来说必须要掌握
C++版本给的是比赛常用最快的sort排序 可以嵌套结构体,函数等等,默认是从小到大排序,如果要从大到小或者自定义排序 则需要嵌入函数

另外,输入采用多组输入格式,一般情况下都可以用多组输入,多组输入一般不会错! 除非题目严格要求用单组输入


C语言版本

#include
#define N 3 //代表三个数
int a[5];
int main(){
    while(scanf("%d %d %d",&a[0],&a[1],&a[2])!=EOF){
        //冒泡排序模板
        for(int i=0;i<N-1;i++){
            for(int j=0;j<N-1-i;j++){
                if(a[j]>a[j+1]){
                    int tmp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=tmp;
                }
            }
        }
        for(int i=0;i<2;i++)
            printf("%d ",a[i]);
        printf("%d\n",a[2]);

    }
    return 0;
}

C++版本

#include
using namespace std;
int a[5];
int main(){
    while(cin>>a[0]>>a[1]>>a[2]){
        sort(a,a+3);
        cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
    }
    return 0;
}

B - Circle in a Rectangle


题目大意

编写一个程序,读取一个矩形和一个圆,并确定圆是否排列在矩形内。如下图所示,给出了矩形的右上角坐标(W,H)和圆心坐标(x,y)以及圆的半径r
HNUCM_入门级题库 (练习2)【题解】_第2张图片


题解

水平方向判断 x - r 和 x + r 是否在矩形范围内 垂直方向判断 y - r 和 y + r 是否在矩形范围内


C语言版本

#include
int main()
{
    int W, H, x, y, r;
    scanf("%d %d %d %d %d", &W, &H, &x, &y, &r);
    if (x - r >= 0 && x + r <= W && y - r >= 0 && y + r <= H)
        printf("Yes\n");
    else
        printf("No\n");
    return 0;
}

C++版本

#include
using namespace std;
int main()
{
    int W, H, x, y, r;
    cin>>W>>H>>x>>y>>r;
    if (x - r >= 0 && x + r <= W && y - r >= 0 && y + r <= H)
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
    return 0;
}

C - Print Test Cases


题目大意

在在线裁判系统中,裁判文件可以包含多个数据集,以检查提交的程序是否为每个测试用例输出正确的答案。这个任务是练习解决一个问题与多个数据集。编写一个程序,读取一个整数x并按原样打印出来。注意,针对这个问题给出了多个数据集。


题解

这个题就是一个典型的多组输入类型,在A题已经介绍了C语言的EOF,这里直接拿来用,然后对于输出结果的格式,我们可以把结果复制一份 然后把需要输出的数据改成我们的变量即可 这样可以降低格式错误的可能性


C语言版本

#include
int main(){
    int x=0,k=0;
    while(scanf("%d",&x)!=EOF&&x){
        printf("Case %d: %d\n",++k,x);
    }
    return 0;
}

C++版本

#include
using namespace std;
int main(){
    int x=0,k=0;
    while(cin>>x&&x){
        cout<<"Case "<<++k<<": "<<x<<endl;
    }
    return 0;
}

D - Swapping Two Numbers


题目大意

编写一个程序,读取两个整数x和y,并按升序打印它们。


题解

对于x > y 输入x y 那么我们直接输出y x 就相当于交换了x和y


C语言版本

#include
int main(){
    int x,y;
    while(scanf("%d %d",&x,&y)!=EOF&&(x+y)){
        if(x>y)
            printf("%d %d\n",y,x);
        else
            printf("%d %d\n",x,y);
    }
    return 0;
}

C++版本

#include
using namespace std;
int main(){
    int x,y;
    while(cin>>x>>y&&(x+y)){
        if(x>y)
            cout<<y<<" "<<x<<endl;
        else
            cout<<x<<" "<<y<<endl;
    }
    return 0;
}

E - How Many Divisors?


题目大意

编写一个程序,读取三个整数a、b和c,并打印出c在a和b之间的除数


题解

用循环遍历 a 到 b 然后判断c对a-b范围内的数是否能取余 如果可以,那么就计数器加1


C语言版本

#include
int main(){
    int a,b,c;
    while(scanf("%d %d %d",&a,&b,&c)!=EOF){
        int cnt=0;
        for(int i=a;i<=b;i++){
            if(c%i==0)
                ++cnt;
        }
        printf("%d\n",cnt);
    }
    return 0;
}

C++版本

#include
using namespace std;
int main(){
    int a,b,c;
    while(cin>>a>>b>>c){
        int cnt=0;
        for(int i=a;i<=b;i++){
            if(c%i==0)
                ++cnt;
        }
        cout<<cnt<<endl;
    }
    return 0;
}

F - A / B Problem


题目大意

编写一个程序,读取两个整数a和b,并计算以下值:
a÷b:d(整数)
a÷b的余数:r(整数)
a÷b:f(实数)


题解

整数和余数直接计算即可 对于实数,可以采用如下方式进行int到double的转化 对于输出保留5位数 一般用C的printf比较方便 所以就没有C++版本了


C语言版本

#include
int main(){
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF){
        printf("%d %d ",a/b,a%b);
        double s=a*1.0/b;
        printf("%.5f\n",s);
    }
    return 0;
}
学如逆水行舟,不进则退

你可能感兴趣的:(算法)