本文已参与「新人创作礼」活动,一起开启掘金创作之路。
第一题 平方根
题目描述
输入一个整数, 求它的平方根,输出答案往下取整.
比如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()向下取整函数,其内容在:t.csdn.cn/DTItE 的第七题上下取整里面;
第二个就是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 ;
}
运行结果:
编辑
第五题 加法模拟器
题目描述
牛牛渐入佳境,他准备做一个加法模拟器来玩玩,输入两个数,分别打印这两个数的横式和竖式运算式子。
输入描述:
输入两个整数a, b 以空格隔开
0 <= a, b <= 1000
输出描述:
第一行打印横式运算式子,接下来四行打印竖式运算式子
示例1
输入
45 237
输出
45+237=282
45
+ 237
-------
282
备注:
注意printf的时候使用%xd来进行右对齐 ,x是一个数字
讲解:
这道题目的本质并不难,就是考一个加法,只不过这个输出比较有意思,他需要右对齐,也就是需要用到我们的%xd,那什么是%xd呢?
%xd,其中这个x是你的输出长度,就是如果你想输出123,那你x取7的话,这样你输出的123前面就会有4个空格,那么这道题也是这样,只不过我们的第二行因为有+的存在我们前面的空格要比其他行数的少一个才对。
AC:
C语言:
#include<stdio.h>
int main()
{
int a, b, c ;
scanf("%d%d", &a, &b) ;
c = a + b ;
printf("%d+%d=%d\n", a, b, c) ;
printf("%7d\n+%6d\n-------\n%7d",a,b,c) ;
return 0;
}
运行结果:
C++:
#include<iostream>
using namespace std ;
int main()
{
int a, b, c ;
cin >> a >> b ;
c = a + b ;
cout << a << "+" << b << "=" << c << endl ;
printf("%7d\n+%6d\n-------\n%7d",a,b,c) ;
return 0;
}
运行结果:
编辑
第六题 判断奇偶
题目描述
判断一个整数n是奇数还是偶数,如果是奇数,输出"odd", 否则输出"even"
输入描述:
输入一个整数n(1 <= n <= 100)
输出描述:
输出odd或者even
示例1
输入
2
输出
even
示例2
输入
1
输出
odd
讲解:
这道题目就是判断奇偶的,那我们的判断方法自然也就使用 ”%“ 了,一个数%2,那如果是0就为偶数;如果是1,就为奇数啦。
可以注意到在代码中很有意思的一点是我在if语句中没有进行判断,也就是没有判断其取余是否等于0,但也可以ac,主要是因为我们这道题奇数就返回的是1,偶数就返回的是0,他已经给你分类好了,如果是奇数,返回1,if语句可以执行;如果是偶数,返回0,需要跳转到else语句中去进行实现。
AC:
C语言:
#include<stdio.h>
int main()
{
int n ;
scanf("%d",&n) ;
if(n%2) printf("odd\n") ;
else printf("even\n") ;
return 0 ;
}
运行结果:
C++:
#include<iostream>
using namespace std ;
int main()
{
int n ;
cin >> n ;
if(n%2) cout << "odd" << endl ;
else cout << "even" << endl ;
return 0 ;
}
运行结果:
第七题 一大一小
题目描述
输入两个整数X,Y,通过交换将大的数放在X中,小的数放在Y中。
输入描述:
输入一行,包含两个整数X,Y
输出描述:
输出两行,每行一个整数,输出交换后的X, Y
示例1
输入
4 5
输出
5
4
讲解:
这道题目想考察的知识点是我们如何进行两个数的交换,交换两个数的方法是,我们先创建第三个变量,将第一个变量的值赋给第三个变量,然后将第二个变量的值赋给第一个变量,紧接着我们将第三个变量的值赋给第二个变量就可以了。
当然这道题目出的确实挺憨的,因为我们不用上面那种交换也可以完成,就像我C++写的代码一样,我们输入时的顺序和我们输出时的顺序一对调,我们不就可以完成了嘛!但是我们写题是为了掌握知识,所以这道题考察的知识点我们还是一点要学会掌握的,不要为了写题而写题。
AC:
C语言:
#include<stdio.h>
int main()
{
int x, y, tmp ;
scanf("%d%d",&x, &y) ;
tmp = x ;
x = y ;
y = tmp ;
printf("%d\n%d",x, y) ;
return 0 ;
}
运行结果:
C++:
#include<iostream>
using namespace std ;
int main()
{
int x, y ;
cin >> x >> y ;
cout << y << endl << x ;
return 0 ;
}
运行结果:
第八题 牛妹数
题目描述
如果一个数是一个偶数而且大于50,我们称它为牛妹数
给你一个数,判断它是否是牛妹数
输入描述:
输入一个整数n (1 <= n <= 100)
输出描述:
如果是牛妹数,输出"yes", 否则输出"no"
示例1
输入
50
输出
no
示例2
输入
52
输出
yes
讲解:
这道题目事项考察我们关系逻辑运算符的,也就是其中的一个”&&"的。首先我们已经知道一个属取余2为1是奇数,为0是偶数了,然后”&&"它的意思是,逻辑与运算符。如果两个操作数都非零,则条件为真。也就是A && B ,当A和B同时为真的时候,这个A && B才为真。
所以我们可以利用这个运算符,使其去满足n为偶数且n大于50的条件了。
AC:
C语言:
#include<stdio.h>
int main()
{
int n ;
scanf("%d",&n) ;
if(n%2 == 0 && n>50) printf("yes\n") ;
else printf("no\n") ;
return 0 ;
}
运行结果:
C++:
#include<iostream>
using namespace std ;
int main()
{
int n ;
cin >> n ;
if(n%2==0 && n>50) cout << "yes" << endl ;
else cout << "no" << endl ;
return 0 ;
}
运行结果:
编辑
好啦,本篇的题目到这里也就结束了,也希望大家都能掌握上面的题目,去复习巩固C/C++基础知识。在这里想问一下大家,你认为学编程语言需要刷题吗?