2019年10月18日实验题目题解(入门)

emmm这周的题目难度还算正常,但是作业题目相当恶心。
还有被吊着打我就很难受。。。
为什么交的那么快。。。
总共六道题还是挺水的

A题分数转小数

Description
求一个分数的小数值,要求保留小数点后2位,并且进行四舍五入。
Input
输入为一个分数m,格式为:“分子/分母”,也可能会有负号:“-分子/分母”。
Output
输出m的小数值,输出保留到小数后2位,根据小数点后的第3位向前四舍五入。
Sample Input
-5/3
Sample Output
-1.67

标程

#include<stdio.h>

int read(){
    int num=0,f=1;
    char ch=getchar();
    while(ch<'0' || ch>'9'){
        if(ch=='-'){
            f=-1;
        }
        ch=getchar();
    }
    while(ch>='0' && ch<='9'){
        num=num*10+ch-'0',ch=getchar();
        if(ch=='/'){
            break;
        }
    }
    return num*f;
}

int main(){
    int a=read(),b;
    b=read();
    double d=(double)a/(double)b;
    d*=100;
    int ans;
    if(d>=0){
        ans=(int)(d+0.5);
    }
    else{
        ans=(int)(d-0.5);
    }
    d=(double)ans/100.0;
    printf("%.2f",d);
    return 0;
}

我在这里运用了快速读入,每个数字以字符的形式读入,之后就无需判断第一位是否为负号(不太习惯读数字这样写)。
之后就很简单。
之前用过四舍五入,他说要在四舍五入到小数点后两位,那就将原数字乘以100,这样就可以对小数点后一位四舍五入取整了。输出的时候将数字初一100就行了。
具体四舍五入的方法其实巧妙地运用了一下强制类型转换的取整特性。
比如输入一个大于零的小数,进行强制类型转换后,数字向下取整,输入一个小于零的小数后,进行强制类型转换后数字向上取整,因此可以在原数字的基础上加(原数字大于零)或减(原数字小于零)之后在进行强制类型转换就可以了。至于原因其实可以在草稿纸上简单算一下就可以了。这样就实现了四舍五入。
至于开头写的快速读入可以私聊我,就是运用了一下getchar()函数读入单个字符。

B题奇怪的求和 之一

Description
给定3个正整数a、b和c,按照如下规则求和:
如果这个数字是偶数,则累加到和中;
如果这个数字是奇数,则将大于该数的最小偶数累加到和中。
Input
三个正整数,均在100以内。
Output
一个和。
Sample Input
2 3 5
Sample Output
12
标程

#include<stdio.h>

int main(){
    int a[3],i,ans=0;
    for(i=0;i<3;++i){
        scanf("%d",&a[i]);
        if(a[i]%2==0){
            ans+=a[i];
        }
        else{
            ans+=a[i]+1;
        }
    }
    printf("%d",ans);
    return 0;
}

解读一下题目,读入三个整数,只需要判断数字是奇数还是偶数,此处只需要对2取余判断是否为0或1即可。
我这里运用了一个数组,这样就可以用一个循环读入数字,这里的数组可以用三个变量代替,只不过写的语句多一点,数组其实可以理解成装满数字的一行小方格。
之后判断数字是否为偶数如果是偶数就加上该数字,如果不是就加上该数加一即可。

C题它满足条件吗?

Description
需要判断给定的一个整数是否同时满足如下三个条件:

  1. 它是一个完全平方数。
  2. 它是一个偶数。
  3. 它是一个正数。
    注:若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数。例如:
    0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529
    Input
    一个int范围内的整数。
    Output
    如果输入的数字满足条件,则输出yes,否则输出no。
    Sample Input
    100
    Sample Output
    yes
    标程
#include<stdio.h>

int main(){
    int n,i;
    scanf("%d",&n);
    if(n%2==0 && n>0){
        for(i=1;;++i){
            if(i*i>n){
                printf("no");
                return 0;
            }
            if(i*i==n){
                printf("yes");
                break;
            }
        }
    }
    else{
        printf("no");
        return 0;
    }
}

这需要有三个判断,判断是否为完全平方数,正数,偶数。
其中正数,偶数的判断很好判断,题目中推荐使用了sqrt(),但是我个人不喜欢,那就循环跑一边判断 i 的平方是否等于输入的数字,如果等于则该数字满足条件,否则一旦平方大于输入的数字则不满足。

D题输出整数的最低两位

Description
把一个整数的最低两位打印出来,不输出整数的符号。
Input
输入为一个整数n,不会超出int类型的数据范围。
Output
输出n的最低两位数字。但是,输入的数字本身不足两位时,不应当补0。如,输入为“1”,则输出为“1”。
Sample Input
-102
Sample Output
02
标程

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

inline int abs(int x){
	if(x>0){
		return x;
	}
	return -x;
}

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

这道题就是一道板子题,取出一个数字的后两位,唯一不同就是一个小细节,判断是否应当补零。
这道题与题目前的正负无关,所以我完全可以用abs()将符号去掉,此处我用的的是手写函数(OI怕被卡常数留下的习惯)之后判断一下是否为三位数,进行取位数操作就可以了。

E题多个数的平均值之一

Description
求k个数的平均值。
Input
输入分为两部分:第一个数是k,然后输入k个较小的整数。
Output
输出为这k个整数的平均值,保留3位小数。
Sample Input
3
1 2 3
Sample Output
2.000
标程

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

int main(){
    int n,i,k,sum=0;
    scanf("%d",&k);
    for(i=0;i<k;++i){
        scanf("%d",&n);
        sum+=n;
    }
    double ans=(double)sum/(double)k;
    printf("%.3lf",ans);
    return 0;
}

比较简单的循环的应用。已经得知了数据的个数,求和并且除一下就可以了,很水。

F题多个数的平均值之二

Description
求k个数的平均值。
Input
输入k个较小的整数,以EOF结尾。
Output
输出为这k个整数的平均值,保留3位小数。
Sample Input
1 2 3
Sample Output
2.000
标程

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

int main(){
    int n,k=0,sum=0;
    while(scanf("%d",&n)!=EOF){
        sum+=n;
        k++;
    }
    double ans=(double)sum/(double)k;
    printf("%.3lf",ans);
    return 0;
}

ACM中很常见的读入数据的方法,不知道数据组数,以EOF结尾,所以可以用while函数
具体写法:

while(scanf("%d",&a)!=EOF){
	……
}
或者
while(scanf("%d",&d)){
	……
}

因为scanf读入数据是有返回值,所以只需要判断返回值是否为真即可。
另一个需要注意的地方就是格式问题,输出结尾可能过多输出一个换行,解决方法就是在输出结果之前输出换行,这样的问题就转移到了首行会多输出一各换行,解决方法可以利用一个标记符flag判断是否为首行,如果是不输出换行并且更改flag的值即可,如果不是则输出换行即可

在这里插入图片描述
OK辣!!!!!
我的公众号上线啦,就叫Lpy Now的小窝欢迎大噶来关注啊

发布了41 篇原创文章 · 获赞 58 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/a1351937368/article/details/102665932