第一题 平方根
题目描述
输入一个整数, 求它的平方根,输出答案往下取整.
比如5=2\sqrt{5} = 25=2, 16=4\sqrt{16}=416=4
输入描述:
输入一个整数n (1 <= n <= 100000)
输出描述:
输出一个整数
示例1
输入
5
输出
2
示例2
输入
16
输出
4
讲解:
通过读题我们发现,如果我们在不调用其他函数的情况下,我们要使用循环去写这个题目,也就是从1-n开始逐次循环,对于每一个数,都要判断其平方于n的大小关系,选择第i个小于等于n且第i+1个是大于n的数就可以了,这听起来并不困难,但是我们还有没有更简便的方法去让我们解决这个问题呢?
答案当然是有的,那就是调用math库里面的函数,第一个就是我们之前牛客刷题系列之中所提到的floor()向下取整函数
第二个就是sqrt()函数,sqrt() 函数的声明是:
double sqrt(double x)
sqrt()函数返回 x 的平方根。所以对于这道题目,我们就可以使用sqrt函数先求出x的平方根,之后再调用floor函数去向下取整就可以了。
AC
C语言:
#include<stdio.h> #include<math.h> int main() { int n, q = 0 ; scanf("%d",&n) ; q=floor(sqrt(n)) ; printf("%d",q) ; return 0; }
运行结果:
C++:
#include<iostream> #include<cmath> using namespace std ; int main() { int n, q = 0 ; cin >> n ; q = floor(sqrt(n)) ; cout << q ; return 0 ; }
运行结果:
第二题 温度转换
题目描述
输入一个浮点数f, 表示华氏温度, 输出对应的摄氏温度c , c=5/9*(f-32)
输入描述:
输入一个浮点数f(1 <= f<= 100000)
输出描述:
输出浮点数,保留3位小数
示例1
输入
100
输出
37.778
讲解:
通过我们读题发现这道题目的题意很简单,连题目中公式都给你准备好啦,看似我们直接按照他的要求套入公式即可,但是其实这道题目有两点坑:
第一点,数据范围,我们在进行解决的时候首先会想到float类型,但是通过我们观察数据发现,由于精度原因我们并无法完全使用float,这时我们就要使用高精度的double去进行解决。
第二点,就是5/9得出的结果是默认整型的,但是这样就等于0了,所以我们要将其变为浮点型,那么我们有两种方式将其变为浮点型 : 1, 用5.0/9 因为这时的5变为5.0,出现了浮点型,所以才会输出浮点型的结果,当然我们将9改为9.0也是一样的道理。2,我们完全可以使用前面所提到的强制转换类型去进行解决这个难题,直接将其类型强制转换一下就可以解决了。
AC
C语言:
#include<stdio.h> int main() { double n, c ; scanf("%lf", &n) ; c = (double)5/9*(n-32) ; printf("%.3lf", c) ; return 0 ; }
运行结果:
C++:
#include<iostream> using namespace std ; int main() { double n, c ; cin >> n ; c = (double)5/9*(n-32) ; printf("%.3lf", c) ; return 0 ; }
运行结果:
第三题 计算机内存
题目描述
我们可以看到题目描述的上方有一个空间限制32M, 在计算机中一个整数占据4个字节的内存, 1MB等于1024KB, 1KB等于1024B, 1B就代表1字节, 那么请问n MB的内存可以使用多少个整数呢?
输入描述:
输入一个整数n,表示内存大小(MB) 1<=n<=256
输出描述:
输出一个整数
示例1
输入
1
输出
262144
讲解:
其实这道题目只是考察了你一个关于内存的基础知识,题目中也提到了1MB等于1024KB, 1KB等于1024B, 1B就代表1字节但是题目很恶心的是,他就差最后一句忘记告诉你了,就是一个整数占据4个字节;当你知道这句话的时候,是不是就突然觉得很简单了,就是用我们的输入去乘上两个1024然后再除以4就可以完美解决问题了。
AC:
C语言:
#include<stdio.h> int main() { int n ; scanf("%d",&n) ; int s = n*1024*1024/4 ; printf("%d\n", s) ; return 0 ; }
运行结果:
C++:
#include<iostream> using namespace std ; int main() { int n ; cin >> n ; int s = n*1024*1024/4 ; cout << s << endl ; return 0 ; }
运行结果:
第四题 四舍五入
题目描述
牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下
12345->12350
12399->12400
输入描述:
输入一个整数n(0<=n<=1090<=n<=10^90<=n<=109)
输出描述:
输出一个整数
示例1
输入
99
输出
100
讲解:
对于这道题目,我相信你读完题目肯定是想先让输入的数取余10,去判断那个数是否大于5,然后如果大就补齐;确实这种是你本能能判断出来的方法,这样也确实可以解这道题目,但是我们有没有更巧妙的方法去解呢?答案当然是有的,我们可以使用int的特性去解。
具体如下,我们先对我们需要四舍五入的数进行+5,这个+5就是如果需要进位的数,他就会进到十位,如果不需要进位的数,就算+5也对十位没有影响,这时我们再去除以10,这个除以10就很灵性了,因为int他要舍去小数点后的位数,所以之前的个位上的数就全部没有了,之前的十位就成个位了,然后我们再去乘以10就完成我们的目标了。
你仔细品一下,这个方法是不是很妙,将进位不在只单独的想成%的方法,而是用加5进十位然后消个位的方法去写,这也是算法的魅力啊。
AC:
C语言:
#include<stdio.h> int main() { int n , m ; scanf("%d",&n) ; m=(n+5)/10*10 ; printf("%d",m) ; }
运行结果:
C++:
#include<iostream> using namespace std ; int main() { int n , m ; cin >> n ; m=(n+5)/10*10 ; cout << m ; }
运行结果: