作为刚刚接触c语言的小白,独自面对的第一道入门题
在刚刚读完题目后就已经陷入了迷茫,不过所有的编程题都可以先用数学进行适当的计算,把它转化为一个数学问题。
首先我看到ai,ti感觉很难,好像在编程的时候不知道该怎么才能弄出这个东西,但是仔细想想不难发现其实这个就是便输入便计算的类型,通过使用一个循环,在每次循环时输入a,t的值,就可以实现ai,ti。(此处我也有用数组的想法,不过直接循环输入就可以了)
解题思路:一共有很多很多的灯,起初都关着(=0),进行n次操作就用循环来实现,而每次操作都把a号,2*a号......t*a号灯的状态改变,于是可以用一个条件判断语句来判断灯变化前的状态从而确定变化后的状态,但因为变化的灯的数目有t盏,所以要用循环嵌套,在原本的循环中在嵌入一个循环,通过循环来控制这t盏灯的状态,如果原本是==0(关着)则赋值为1(打开),反之则赋值为0(关闭)......循环n次之后出来,这时依据题意只有一盏灯还亮着,要问亮着的灯是第几盏,那么就是说此时我需要排查出第几项是1,所以就用循环,对每个数逐个进行判断,如果这个数是1则输出该数的项数作为亮着的灯的编号。
于是有了这样的代码:
在编写代码过程中发生的错误:
1,scanf函数中的%f %d与a t的对应关系搞错了,就是整型的t却用了%f,而浮点型的a却用了%d导致后面的代码都出错;
2,scanf函数中的%f写成了%.6f,而导致结果出错,题目中要求是六位小数没错,但是在输入中是没有几位小数的说法的,也不能写成.6f(或者什么.2f等),这些只有在输出时才能用,printf函数中使用来控制输出的数的小数点位数;
3,在while(n--){}的最后面加上了a=0,t=0(当时的想法是每次循环的结束都把数据清零),但是在while循环的末尾是不用弄这个的,它进入下一次循环后可以直接再次赋值;
4,在写代码时一些数据没有符合实际,不合理。当时定义f[100001],后面在进行f[k]的寻找的时候k却用<200000,导致报错。在写一些数据时应该先确定这个数字是在其范围之内的,不能抛开了范围而随意编写,注意数字的合理性;
5,数组没有初始化就默认为0,但是出于规范,还是用上memset(f,0,sizeof(f))(要<string.h>的头文件),通过这个函数将f[]数组都定义为0;