n根蜡烛,每次吹灭现存的第奇数根,剩下的是哪一根?如何用c++解答

几天前电脑老师出了这个题目,让我们用c++解决。

那么,问题来了,我们怎么用c++来解决这个问题呢?

开头照旧,先导入头文件再说话:

#include<cstdio>
using namespace std;

当然,如果你是初学者,建议使用这个:

#include<iostream>
using namespace std;

我们来定义一个算法函数吧!

先定义函数名,你自己怎么弄都行,反正我喜欢以t开头。

因为我们要得到第几根蜡烛这个整数,所以函数类型我们定义为int。

我们以i代表题目里的n,定义:

int txjf(int i)
{

}

当然,我们还需要建立多个辅助变量,来计算数据。他们分别是:

w:最后一根仍亮着的蜡烛的编号。

y:此次循环中亮着的蜡烛的总数量(用于计算是不是第奇数根蜡烛)。

z:每次吹完蜡烛后剩下的蜡烛数。

数组s[i]:用以保存蜡烛的状态。

​int txjf(int i)
{
	int w,y,z;
	int s[i];
	
}

​

这里,我们用0和1分别代表蜡烛熄灭的状态和未熄灭状态。

初始化是不能少的,因为s[i]中蜡烛熄灭了就不能再点着,所以它是函数中的全局变量,应在定义完一开始就初始化完成。

​
int txjf(int i)
{
	int w,y,z;
	int s[i];
	for(int j=1;j<=i;j++) s[j]=1;
}

​

这样蜡烛就全都亮起来啦!

当然,因为题目中是不停循环吹蜡烛这个动作,所以循环语句是不能少的。 

我们一开始并不知道n(在函数中是i)的值,所以我们也不会知道要吹几轮蜡烛。

那for就暂时派不上用场了。

在重力,我选用的是do-while语句,达到一定条件(即z==1)时退出循环,并返回(return)w的值。

那么,while()括号中的条件语句当然就得变成(z!=1)了!

继续: 

​int txjf(int i)
{
	int w,y,z;
	int s[i];
	for(int j=1;j<=i;j++) s[j]=1;
	do{
		
	}while(z!=1);

}

​

刚才说到要初始化,因为w、y、z都是循环语句局内每循环一次都会发生改变的变量,所以初始化应在循环语句内一开始处进行。

​
int txjf(int i)
{
	int w,y,z;
	int s[i];
	for(int j=1;j<=i;j++) s[j]=1;
	do{
		z=0;
		w=0;
		y=0;
		
	}while(z!=1);

}

​

 下一步就是吹蜡烛啦!

我们知道,判断偶数的方法是看此数是否能被2整除(y%2==0)。

那奇数就是y%2!=0或y%2==1了。

这次,蜡烛的数量是知道的,就可以用for语句了。

然后,我们在循环语句内判断,如果是奇数,就吹灭(s[a]=0)。

对了,如果已经经过循环,那么亮着的蜡烛数就不是i了。所以,我们应该在这之前先判断这支蜡烛是否还亮着,如果亮着(s[a]==1),y++,再来判断要不要吹灭;熄灭了(s[a]==0),直接跳过下面的吹蜡烛动作,继续循环。

​
int txjf(int i)
{
	int w,y,z;
	int s[i];
	for(int j=1;j<=i;j++) s[j]=1;
	do{
		z=0;
		w=0;
		y=0;
		for(int a=1;a<=i;a++)
		{
			if(s[a]==1)
			{
				y++;
				if(y%2==1) s[a]=0;
			}
		}
		
	}while(z!=1);

}

接着,做完一次吹蜡烛,我们就来判断:是不是只剩一根蜡烛了?如果是,这根蜡烛的编码是第几根?

我们继续用for循环,把i根蜡烛全部都问候一遍。

也就是,如果s[b](对不起,我不是故意把这个数组搞得这么脏的)==1,z就自增1,w就被赋值为b这个编号。

​
int txjf(int i)
{
	int w,y,z;
	int s[i];
	for(int j=1;j<=i;j++) s[j]=1;
	do{
		z=0;
		w=0;
		y=0;
		for(int a=1;a<=i;a++)
		{
			if(s[a]==1)
			{
				y++;
				if(y%2==1) s[a]=0;
			}
		}
		for(int b=1;b<=i;b++)
		{
			if(s[b]==1){
				z++;
				w=b;
			}
		}

	}while(z!=1);

}

很好。最后就是返回值语句return了。

用两种方式,一种是在循环内判断z是否等于1,立即return w;

int txjf(int i)
{
	int w,y,z;
	int s[i];
	for(int j=1;j<=i;j++) s[j]=1;
	do{
		z=0;
		w=0;
		y=0;
		for(int a=1;a<=i;a++)
		{
			if(s[a]==1)
			{
				y++;
				if(y%2==1) s[a]=0;
			}
		}
		for(int b=1;b<=i;b++)
		{
			if(s[b]==1){
				z++;
				w=b;
			}
		}
		if(z==1)
			return w;
	}while(z!=1);
}

另一种是在循环语句做完后(此时z一定等于1了),再return w。这样,会稍微简单一点。

​
int txjf(int i)
{
	int w,y,z;
	int s[i];
	for(int j=1;j<=i;j++) s[j]=1;
	do{
		z=0;
		w=0;
		y=0;
		for(int a=1;a<=i;a++)
		{
			if(s[a]==1)
			{
				y++;
				if(y%2==1) s[a]=0;
			}
		}
		for(int b=1;b<=i;b++)
		{
			if(s[b]==1){
				z++;
				w=b;
			}
		}
	}while(z!=1);
    return w;
}

以上就是我的思路,可以参考一下。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值