《C++编程这样学》第四章:循环结构 - 加油站题解

1. 统计闰年

题目链接:http://csp.magu.ltd/problem/J0412

【问题描述】

编写程序,统计从 x x x 年到 y y y 年中闰年的数量并输出。

【题解代码】
#include <iostream>
using namespace std;

int main()
{
    int x, y, cnt = 0;
    cin >> x >> y;
    for (int i = x; i <= y; i++)
    {
        if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
            cnt++;
    }
    cout << cnt << endl;
    return 0;
}

2. 求斐波那契数列的某一项

题目链接:http://csp.magu.ltd/problem/J0413

【问题描述】

斐波那契数列,又称黄金分割数列,以兔子繁殖为例子而引入,故又称为“兔子数列”。

斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34…,即第1项是1,第2项是1,后面任意一项是它前面两项的和。

编写程序,要求数列的第n个数是多少(n是不大于40的正整数)。

【题解代码】
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int a = 1, b = 1, c;
    if (n == 1 || n == 2) {
        cout << 1;
        return 0;
    }
    for (int i = 3; i <= n; i ++) {
        c = a + b;
        a = b;
        b = c;
    }
    cout << c;
    return 0;
}

3. 求满足条件的数的个数

题目链接:http://csp.magu.ltd/problem/J0418

【问题描述】

编写程序,给定n个四位数,求出其中满足以下条件的数的个数。
个位上的数字减去千位的数字,再减去百位的数字,再减去十位的数字的结果大于零。

【题解代码】
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int cnt = 0;
    while (n--)
    {
        int x;
        cin >> x;
        int g = x % 10, s = x / 10 % 10, b = x / 100 % 10, q = x / 1000 % 10;
        if (g - q - b - s > 0)
            cnt++;
    }
    cout << cnt;
    return 0;
}

4. 求一个正整数的所有因子

题目链接:http://csp.magu.ltd/problem/J0414

【问题描述】

在数学中,对于正整数A和B,如果整数A能被B整除,就称B是A的因子。比如8的因子有1,2,4和8。

编写程序,输入一个正整数n,按从小到大输出n的所有因子。

【题解代码】
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        if (n % i == 0)
            cout << i << " ";
    }
    return 0;
}

5. 求数根

题目链接:http://csp.magu.ltd/problem/J0415

【问题描述】

在数学中,数根是自然数的一种性质,换句话说,每个自然数都有一个数根。

数根是将一正整数的各个位上的数相加,若加完后得到的数是一位数,那么这个数就是数根;如果得到的数是两位或者两位以上的数,就再把它的各位数字相加…如此进行下去,直到得到的数是一个一位数为止。

例如,24,把2和4相加得到6,由于6是一个一位数,因此6是24的数根。

再例如39,把3和9相加得到12,由于12不是一位数,因此再把1和2相加,最后得到3,这是一个一位数,因此3是39的数根。

编写程序,输入一个正整数n,输出它的数根。

【题解代码】
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    while (n >= 10)
    {
        int m = n;
        int s = 0;
        while (m)
        {
            s += m % 10;
            m /= 10;
        }
        n = s;
    }
    cout << n << endl;
    return 0;
}

6. 求最小的n

题目链接:http://csp.magu.ltd/problem/J0416

【问题描述】

对于公式 S = 1 + 1 / 2 + 1 / 3 … + 1 / n S=1+1/2+1/3…+1/n S=1+1/2+1/3+1/n,编写程序,求正整数n最小为多少时,s的值不小于给定的k。

【题解代码】
#include <iostream>
using namespace std;

int main()
{
    int k;
    cin >> k;
    double s = 0;
    int n = 0;
    while (s < k)
    {
        n++;
        s += 1.0 / n;
    }
    cout << n << endl;
    return 0;
}

7. 验证角谷猜想

题目链接:http://csp.magu.ltd/problem/J0417

【问题描述】

角谷猜想又称冰雹猜想。它首先流传于美国,不久传到欧洲,后来由一位叫角谷的日本人带到亚洲。因此被称为角谷猜想。

角谷猜想是这样的:任意给定一个正整数n,当n是偶数时,将它除以2,即将它变成n/2;当n是奇数时,就将它变成 3 n + 1 3n+1 3n+1,对得到的结果再按照上述规则进行处理,若干步后,最终总能够得到1。例如,假定初始整数为5,按上述规则处理得到的结果分别为16 8 4 2 1

在上述演变过程中,将每一次出现的数字排列起来,就会出现一个数字序列。
编写程序,输入一个正整数n,按上述规则进行处理并输出从整数n到变换到1的数字序列。

【题解代码】
#include <iostream>
using namespace std;

int main()
{
	long long n;
	cin >> n;
	if (n == 1)
	{
		cout << 1 << endl;
		return 0;
	}
	while (n != 1)
	{
		if (n % 2 == 0) n /= 2;
		else n = 3*n + 1;
		cout << n << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值