本文共 4233 字,大约阅读时间需要 14 分钟。
emmm这周的题目难度还算正常,但是作业题目相当恶心。
还有被吊着打我就很难受。。。 为什么交的那么快。。。 总共六道题还是挺水的A题分数转小数
Description
求一个分数的小数值,要求保留小数点后2位,并且进行四舍五入。 Input 输入为一个分数m,格式为:“分子/分母”,也可能会有负号:“-分子/分母”。 Output 输出m的小数值,输出保留到小数后2位,根据小数点后的第3位向前四舍五入。 Sample Input -5/3 Sample Output -1.67标程
#includeint 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 标程#includeint 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
需要判断给定的一个整数是否同时满足如下三个条件:#includeint 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#include #include 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#include #include int main(){ int n,i,k,sum=0; scanf("%d",&k); for(i=0;i
比较简单的循环的应用。已经得知了数据的个数,求和并且除一下就可以了,很水。
F题多个数的平均值之二
Description
求k个数的平均值。 Input 输入k个较小的整数,以EOF结尾。 Output 输出为这k个整数的平均值,保留3位小数。 Sample Input 1 2 3 Sample Output 2.000 标程#include#include #include 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的小窝欢迎大噶来关注啊转载地址:http://airub.baihongyu.com/