循环结构题

【牛客网】

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

#include <iostream>

using namespace std;

int main() {

     

    int n;

    cin >> n;

    int sum = 0;

    for(int i = 2; i <= n; i += 2//从2开始,每两个元素遍历一次

        sum += i; //累加

    cout << sum << endl;

    return 0;

}

方法二:数学规律

具体做法:

我们观察如下图

可以发现当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

#include <iostream>

using namespace std;

int main() {

     

    int n;

    cin >> n;

    int sum = 0;

    if(n % 2 == 1//奇数等于比它小的那个偶数

        n--;

    sum = (n / 2) * (n / 2 1); //公式计算

    cout << sum << endl;

    return 0;

}

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

#include <iostream>

using namespace std;

long long recursion(int n){

    if(n == 1)

        return 1;

    return recursion(n - 1) * n; //递归计算n*f(n-1)

}

int main() {

    int n;

    cin >> n;

    long long factorial = recursion(n); //递归

    cout << factorial << endl;

    return 0;

}

方法二:迭代

具体做法:

除了自上而下的递归,我们也可以采用朴素的自下而上的累乘,遍历222到nnn(111就不用再乘了),将遇到的每个数累乘即可。

复制代码

1

2

3

4

5

6

7

8

9

10

11

12

#include <iostream>

using namespace std;

int main() {

    int n;

    cin >> n;

    long long factorial = 1;

    for(int i = 2; i <= n; i++) //迭代2到n,1就不用了

        factorial *= i;  //累乘

    cout << factorial << endl;

    return 0;

}

 

 

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

#include <iostream>

using namespace std;

bool isNarcissus(int num){

    int temp = num;

    int a = num % 10//个位

    num /= 10;

    int b = num % 10//十位

    num /= 10;

    int c = num % 10//百位

    if(temp == a * a * a + b * b * b + c * c * c) //判断个位、十位、百位数各自三次方后相加是否等于该数

        return true;

    else

        return false;

}

int main() {

    for(int i = 100; i < 1000; i++){ //遍历所有的三位数

        if(isNarcissus(i)) //如果是水仙花数则输出

            cout << i << endl;

    }

    return 0;

}

 

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

#include <iostream>

using namespace std;

int main() {

     

    int n;

    cin >> n;

    //i表示乘法表行数.

    for(int i=1;i<=n;i++){

        //j表示乘法表列数

        for(int j=1;j<=i;j++){

            //按对应格式输出乘法表

            cout<<j<<" * "<<i<<" = "<<j*i<<"    ";

        }

        //每打印完一行,进行换行

        cout<<endl;

    }

    return 0;

}

 

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

#include <iostream>

using namespace std;

int main() {

    //记录数列的和

    long long sum=0;

    //记录数列中每一项

    long long num=0;

    for(int i=1;i<=10;i++){

        //模拟计算每一项

        num=num*10+9;

        //将对应项累加到sum

        sum+=num;

    }

    cout<<sum<<endl;

    return 0;

}

 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;
}
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值