【牛客网】
1.键盘输入一个 int 类型的正整数 n,n 的范围为[1, 1000],求 1 - n 之间偶数的和,并输出
方法一:累加
具体做法:
求 1−n1 - n1−n 之间偶数的和意味着,求2+4+6+8+...2+4+6+8+...2+4+6+8+...,一直加到nnn或者n−1n-1n−1为止,那我们可以从222开始遍历,每次跨越两步使遍历的对象正好都是偶数,当遍历到大于nnn就停止,这个过程累加即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
方法二:数学规律
具体做法:
我们观察如下图
可以发现当nnn为奇数时,答案为比其小的偶数的答案,而当nnn为偶数等于它的一半乘上一半加1,对nnn为偶数有公式:(n/2)∗(n/2+1)(n/2)*(n/2+1)(n/2)∗(n/2+1)。
于是我们优先判断nnn是否为奇数,如果是对其减1再按照公式计算,如果不是奇数,直接公式计算得到结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
2.
键盘录入一个整数 n,求 n 的阶乘。n 的阶乘为 n * (n - 1) * (n - 2) * ... * 1。例:5 的阶乘为 5 * 4 * 3 * 2 * 1。
方法一:递归
具体做法:
我们可以将求nnn的阶乘看成问题f(n)=n∗(n−1)∗(n−2)∗...∗2∗1f(n)=n*(n-1)*(n-2)*...*2*1f(n)=n∗(n−1)∗(n−2)∗...∗2∗1,而f(n)=n∗f(n−1)f(n)=n*f(n-1)f(n)=n∗f(n−1),这样我们就将nnn的问题化为了n−1n-1n−1的子问题,我们不断往前每次递归的nnn值乘上子问题的答案就可以了,直到n=1n=1n=1结束递归。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
方法二:迭代
具体做法:
除了自上而下的递归,我们也可以采用朴素的自下而上的累乘,遍历222到nnn(111就不用再乘了),将遇到的每个数累乘即可。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
3.
在控制台输出所有的“水仙花数”。水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
举例:153就是一个水仙花数。153 = 1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 = 153。
具体做法:
首先水仙花数只会是三位数,因此我们遍历100−999100 - 999100−999,即所有的三位数,对每一个三位数检查是否是水仙花数。
检查的时候,我们用对10取余求得个位数字,让其除以10以后再对10取余求得10位数字,最后再除以10以后对10取余求得百位数字。三个数字各自的三次方求和与原数比较,如果相等则是水仙花数,输出该数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
4.
键盘输入一个正整数 n,打印对应的乘法表。例如键盘输入 3,则打印 3 × 3 乘法表
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
1).解题思路
- 先确定乘法表行数,再确定列数。
- 按指定格式,输出对应坐标的乘法公式。
图解展示:
2).代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
5.有数列为:9,99,999,...,9999999999(10个9)。要求使用循环结构编写程序计算此数列的和,并在控制台输出结果。
1).解题思路
- 利用循环模拟计算出每一项。
- 每轮循环中,将对应项累加到sum。
动图展示:
2).代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
6.一球从 h 米高度自由落下,每次落地后反跳回原高度的一半再落下,求它在第 n 次落地时共经过了多少米?第 n 次返弹多高?
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
// 下落的高度和落地的次数
double h;
int n;
cin >> h;
cin >> n;
// write your code here......
double sum=0;
for(int i=0;i<n;i++){
sum+=h;
if(i>0) sum+=h;
h/=2.0;
}
cout<<fixed<<setprecision(1)<<sum<<" "<<setprecision(1)<<h<<endl;
return 0;
}
7.输入一个大于 1 的整数,判断其是不是质数
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=2;i<=n;i++)
{
if(i==n)
{
cout<<"是质数"<<endl;break;
}
if(n%i==0){
cout<<"不是质数"<<endl;
break;
}
}
return 0;
}