几天前电脑老师出了这个题目,让我们用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;
}
以上就是我的思路,可以参考一下。