本文主要是介绍假期刷题打卡--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或者是2a[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;
}
明天继续吧。
这篇关于假期刷题打卡--Day30的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!