假期刷题打卡--Day30

1、MT1228宝宝抢糖果

宝宝们一起抢N个糖果(N<=10),手快的宝宝可以抢到2个糖果,手慢的只能抢到一个糖果。统计糖果可以多少种方式被瓜分。

格式

输入格式:

输入正整数N

输出格式:

输出整型

样例 1

输入:

4

输出:

5
分析过程

看到这个题,首先想到的是写两个循环,进行暴力尝试。于是,写下了代码:

#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    int n,count=0;
    cin >> n;
    for(int i=0;i<=n;i++){
        for(int j=0;j<=n;j++){
            if(n==i+2*j){
//                cout << i << "*" << j << "&" << endl;
                count++;
            }
        }
    }
    cout <<  count;
    return 0;
}

但是,发现执行代码的时候,执行结果并不能满足最终结果,所以,我的解决思路应该不太合适,需要重新思考。

于是去查看别人的思路,说这个题目依旧属于斐波那契数列,我不太理解,所以就去找轩哥码题了。

【码蹄集新手村全题解10】循环结构 MT1185 – MT1234_哔哩哔哩_bilibili

按照我的思路,实现的是输入数中1和2出现个数的方式数。比如说输入数为4,那么就能出现三种情况,前面数字为1的个数,后面数字为2的个数:
0 2

2 1

4 0

        所以并不是此题的答案。

        此题要求的是宝宝要抢糖果,但是不知道宝宝有多少个,所以就从糖果数入手。

        设一个数组a用来存储每次拿到糖果数的方式的个数,例如a[1]就表示1个糖果被拿走的方式只有一个,即1个都拿走;a[2]就表示2个糖果拿走的方式,2可以是1+1或者2+0,所以就是两种方式,所以先将这两种情况的实现方式次数存储起来。

        最后拿到的糖果数不是1就是2,假设是1,前面的糖果拿走的方式就是a[n-1];若是最后拿走2个,那么前面的糖果就有a[n-2]种方式。

详细的理解方式,可以参考轩哥码题的宝宝爬楼梯的这个解释。

【码蹄集新手村全题解10】循环结构 MT1185 – MT1234_哔哩哔哩_bilibili

所以,最后实现的代码如下:

实现代码
#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    int n, a[10] = {0,1,2};//数组下标从0开始的,所以前面加个0,跟前面计算月份天数的那个题一样
    cin >> n;
    for(int i=3;i<=n;i++){//拿的糖果数是1或者是2
        a[i] = a[i-1]+a[i-2];
        // cout << a[i] << "*" <<a[i-1] << "&" << a[i-2]<< endl;
    }
    cout << a[n];
    return 0;
}
个人反思

        虽然感觉自己懂了点,但是真的看到这个题目的时候还是懵了,还是不知道从何处下手。但是还是不能偷懒,先按照自己的理解写出这个代码,如果通过了,就皆大欢喜,如果通过不了,那么就重新思考,实在思考不出来就去参考别人的解题思路,然后在记忆,后面慢慢使用。我就准备按照这个方式学,先去看看有没有效果吧。刷题继续。

2、MT1230圆周率

编写一个程序,使用以下公式计算PI的近似值PI=4(1-1/3+1/5-1/7+1/9…)。括号中的最后一项应小于十的负六次方。

格式

输入格式:

输出格式:

输出为实型,保留2位小数

样例 1

输入:

输出:

3.14
分析过程

我最初理解的就是设置一个变量作为分母,同时作为循环变量,直到不满足条件,所以,首先写的代码如下:

#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    double a,sum=0;
    for(int a=1;a<pow(10,-6);a=a+2){
        sum += 1.0/a;
        // cout << sum;
    }
    printf("%.2f",sum);
    return 0;
}

但是发现,输出的结果为0.00,然后我发现,我连题目都看错了,计算的公式里面是有‘-'和'+'这两种情况的,所以重新去阅读题目,重新开始写。

重新理解后,发现这道题的计算公式中,两种情况,一种是加一种是总数减,所以按照理解,我又写了这个代码:

#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    double a,sum=1;
    int count=0;
    for(int i=3;;i=i+2){
        a = 1.0/i;
        count++;
        if(count%2!=0){
            sum -= a;
            // cout << sum << "&&" << endl;
        }else{
            sum += a;
            // cout << sum << "**" << endl;
        }
        if((1.0/i)<0.000001){
            // cout << i << "^";
            printf("%.2f",sum);
            break;
        }
    }

    return 0;
}

我感觉没什么错误,但是输出结果是0.79,这是为什么呢?

是因为前面没有*4,天哪,就离谱,那么大的一个4被我忽略掉了。

加上乘以四之后,成功实现代码,如下:

实现代码
#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    double a,sum=1;
    int count=0;
    for(int i=3;;i=i+2){
        a = 1.0/i;
        count++;
        if(count%2!=0){
            sum -= a;
            // cout << sum << "&&" << endl;
        }else{
            sum += a;
            // cout << sum << "**" << endl;
        }
        if((1.0/i)<0.000001){
            // cout << i << "^";
            printf("%.2f",sum*4);
            break;
        }
    }

    return 0;
}

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值