虽然我平时也没刷几道题,但是还是选择给自己两天休息时间,现在继续了,直到开学。
宝宝们一起抢N个糖果(N<=10),手快的宝宝可以抢到2个糖果,手慢的只能抢到一个糖果。统计糖果可以多少种方式被瓜分。
输入格式:
输入正整数N
输出格式:
输出整型
输入:
4
输出:
5
看到这个题,首先想到的是写两个循环,进行暴力尝试。于是,写下了代码:
#include
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
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] << "*" <
虽然感觉自己懂了点,但是真的看到这个题目的时候还是懵了,还是不知道从何处下手。但是还是不能偷懒,先按照自己的理解写出这个代码,如果通过了,就皆大欢喜,如果通过不了,那么就重新思考,实在思考不出来就去参考别人的解题思路,然后在记忆,后面慢慢使用。我就准备按照这个方式学,先去看看有没有效果吧。刷题继续。
编写一个程序,使用以下公式计算PI的近似值PI=4(1-1/3+1/5-1/7+1/9…)。括号中的最后一项应小于十的负六次方。
输入格式:
无
输出格式:
输出为实型,保留2位小数
输入:
无
输出:
3.14
我最初理解的就是设置一个变量作为分母,同时作为循环变量,直到不满足条件,所以,首先写的代码如下:
#include
using namespace std;
int main( )
{
double a,sum=0;
for(int a=1;a
但是发现,输出的结果为0.00,然后我发现,我连题目都看错了,计算的公式里面是有‘-'和'+'这两种情况的,所以重新去阅读题目,重新开始写。
重新理解后,发现这道题的计算公式中,两种情况,一种是加一种是总数减,所以按照理解,我又写了这个代码:
#include
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
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;
}
明天继续吧。