【大摆子 做 摆烂题】【C++】

本文介绍了几个编程挑战,包括使用斐波那契数列计算兔子数量,日期到天数的转换,计算整数二进制中1的个数,查找字符出现次数,确定完全数,以及解决杨辉三角的变形问题。这些题目涵盖了递归、日期处理、位操作和数学逻辑等多个方面,是提升编程技能的好练习。
摘要由CSDN通过智能技术生成

1. 统计每个月兔子的总数

描述:有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。

例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。

一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?

数据范围:输入满足 1 \le n \le 31 \1≤n≤31

输入描述:输入一个int型整数表示第n个月

输出描述:输出对应的兔子总数

1.1 思路

1. 把题理一理就发现这是斐波那契数列直接递归求解斐波那契数列就好了

1.2 代码实现

#include<iostream>
using namespace std;
int fib(int n)
{
    if(n < 3)
    {
        return 1;
    }
    else{
        return fib(n - 1) + fib(n - 2);
    }
}
int main()
{
    int month = 0;
    cin >> month;
    int num = 0;
    num = fib(month);
    cout << num << endl;
}

2. 计算日期到天数转换

描述:根据输入的日期,计算是这一年的第几天。

保证年份为4位数且日期合法。

进阶:时间复杂度:O(n)\O(n) ,空间复杂度:O(1)\O(1)

输入描述:输入一行,每行空格分割,分别是年,月,日

输出描述:输出是这一年的第几天

2.1 思路

1. 先判断是否是闰年把29 28 先判断清楚。

2. 把所有月放在一个数组里面之后算天数也好算。

3. 把天数直接就统计了。

2.2代码实现

#include<iostream>
using namespace std;
bool isleapyear(int y)
{
    return(y % 4 == 0 && y % 100 != 0) ||(y % 400 == 0);
}
int getmonth(int year, int month)
{
    int days[13] = {29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if(month == 2 && isleapyear(year))
    {
        month = 0;
    }
    return days[month];
}
int getdays(int year, int month, int day)
{
    int days = 0;
    for(int i = 1; i < month; ++i)
    {
        days += getmonth(year, i);
    } 
    days += day;
    return days;
}

int main()
{
    int year = 0,month = 0,day = 0;
    int days = 0;
    while(cin >> year >> month >> day)
    {
        days = getdays(year,month,day);
        cout << days << endl;
    }
}

3. 查找输入整数二进制中1的个数

输入一个正整数,计算它在二进制下的1的个数。

注意多组输入输出!!!!!!

输入描述:输入一个整数

输出描述:计算整数二进制中1的个数

3.1 思路

1. 会做把一个十进制打印二进制就会做这个题。

2. num >> i & 1 这个已经见怪不怪了。

3. 注意多组输入输出!就得用一下while  和 

3.2 代码实现

#include<iostream>
using namespace std;
int gitbit(int num)
{
    int count = 0;
    for (int i = 32;i >= 0;--i)
    {
        if((num >> i) & 1 == 1)
        {
            ++count;
        }
    }
    return count;
}
int main()
{
    int n = 0;
    while(cin >> n)
    {
        cout << gitbit(n) << endl;
    }
}

4. 计算某字符出现次数

写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)

输入描述:第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字符。

输出描述:输出输入字符串中含有该字符的个数。(不区分大小写字母)

4.1 思路 

1. 翻译题没有啥说的

4.2 代码实现

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1;
    char s2;
    getline(cin,s1);
    cin >> s2;
    int count = 0;
    for(int i = 0;i < s1.size();i++)
    {
        if(s1[i] == s2)
        {
            ++count;
        }
        else if(s2 >= 'A' && s2 <= 'Z')
        {
            s2 += 32;
            if(s1[i] == s2)
            {
                ++count;
            }
        }
        else if(s2 >= 'a' && s2 <= 'z')
        {
            s2 -= 32;
            if(s1[i] == s2)
            {
                ++count;
            }
        }
    }
    cout << count << endl;
}

5. 完全数计算

描述:完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

输入n,请输出n以内(含n)完全数的个数。

输入描述:输入一个数字n

输出描述:输出不超过n的完全数的个数

5.1 思路

1. 通过遍历每个数字找到质数求和看是否相等。

5.2 代码实现

#include<iostream>
using namespace std;
int perfectnum(int num)
{
    int sum = 0;
    int count = 0;
    for(int i = 2;i < num;++i)
    {
        for (int j = 1;j <= i >> 1;++j)
        {
            if(i % j == 0)
            {
                sum += j;
            }
        }
        
        if(sum == i)
        {
            ++count;
        }
        sum = 0;
    }
    return count;
}
int main()
{
    int n = 0;
    while(cin >> n)
    {
         cout << perfectnum(n)<< endl;
    }
}

6. 完美数

对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。

给定一个 整数 n, 如果是完美数,返回 true;否则返回 false。

示例 1:

输入:num = 28
输出:true
解释:28 = 1 + 2 + 4 + 7 + 14
1, 2, 4, 7, 和 14 是 28 的所有正因子。
示例 2:

输入:num = 7
输出:false

6.1 思路

1. 这个跟刚刚一样 只不过力扣测试样例更多一点  刚刚质数判定是选用的到一半就停,我这个选用开方来做

6.2 代码实现

class Solution {
public:
    bool checkPerfectNumber(int num) {
        if(num == 1)
        {
            return false;
        }
        int sum = 1;
        for(int i = 2;i <= sqrt(num);i++)
        {
            if(num % i == 0)
            {
                sum += i;
                if(num / i != i)
                {
                    sum += num / i;
                }
            }
        }
        return sum == num;
    }
};

7. 杨辉三角的变形

以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数、左上角数和右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。

求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3,输入2则输出-1。

输入描述:输入一个int整数

输出描述:输出返回的int值

7.1 思路

1. 有规律的找找规律。

7.2 代码实现

#include<iostream>
using namespace std;
int main()
{
    int n;
    while(cin >> n)
    {
        if(n <= 2)
        {
            cout<<-1<<endl;
        }
        else if((n-2) % 4 == 0)
        {
            cout << 4 << endl;
        }
        else if(n % 2 == 1)
        {
            cout << 2 << endl;
        }
        else
        {
            cout << 3 << endl;
        }
    }
    return 0;
}

 

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五毛变向.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值