100个人,100盏灯,全部熄灭,第一人过去按所有灯的开关,第二个人会每隔一盏灯按开关,第三个人每隔2盏灯按开关,以此类推,第100人隔99盏灯按开关,100个人都走完,剩多少盏灯亮着?

100个人,100盏灯,全部熄灭,第一人过去按所有灯的开关,第二个人会每隔一盏灯按开关,第三个人每隔2盏灯按开关,以此类推, 第100人隔99盏灯按开关。
问:100个人都走完,剩多少盏灯亮着?

  总结来说,所有人都是按他自己编号的倍数的灯(编号都是从1开始),也就是说:1 号人按所有灯,2 号人按 2 4 6 8 10 号灯,三号人按 3 6 9 号灯,依次类推。
  我们可以发现:一盏灯如果被按了奇数次,最后就是亮着的;被按了偶数次,最后就是灭的。而一盏灯被按的次数,就是它编号的约数的个数,比如 1 号灯约数就一个 1 所以亮,2 号灯约数是 1 和 2所以灭,3 号灯约数是 1 和 3 所以灭,4 号灯约数是 1、2、4 所以亮,16号灯约数是 1、2、4、8、16 所以亮。。以此类推。
  通过归纳总结,可以看出,只有完全平方数的约数个数为奇数,所以只有完全平方数编号的灯,最后是亮着的,100盏灯的话就是 1、4、9、16、25、36、49、64、81、100(也就是1 到 10 这 10 个数的平方),共十盏灯。

证明:正整数n为完全平方数的充分必要条件是n的正约数个数是奇数个

  上边是通过归纳总结看出来的结论,但其实是可以证明的,分为充分性和必要性两方面证明:

充分性(完全平方数正约束个数一定是奇数)
  1. n = 1 时,正约数 1 个,是奇数;
  2. n > 1 时,n2 的约数: 1 … n … n2,且 1 和 n 之间每多一个约数,例如m,那么 n 到 n2 之间就会多一个约数 n2/m,也就是说除了 1、n、n2自身 这三个约数,其他的约数是成对出现的,也就是说约数的总个数为 3 + 偶数,结果必为奇数。
必要性(正约数个数为奇数的正整数一定为完全平方数)
  1. 1 的约数是 1,只有一个,且 1 是完全平方数
  2. 如果一个数的公约数是 1 和他本身,那它就是质数,肯定不是完全平方数
  3. 如果一个数 m 的公约数除 1 和他本身,还有其他的公约数,我们设其中一个数为 p,那么必定存在一个约数 m/p,也就是说公约数是成对出现的,除非这两个数相等,也就是同一个数,否则公约数的个数就肯定是偶数,所以m 有完全平方根时,公约数个数是奇数;m 没有完全平方根时,公约数个数是偶数。

  所以正约数个数为奇数的,一定是完全平方数。

好的,针对您的新问题,可以参考以下代码实现: ``` #include "stm32f10x.h" int main(void) { // 初始化GPIO口 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 定义按键变量 uint8_t key = 0; // 定义计数器变量 uint16_t count = 0; while (1) { // 判断按键是否按下 if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) { // 等待按键释放 while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0); // 判断按键状态 switch (key) { // 第一次按下 case 0: // 点LED GPIO_SetBits(GPIOC, GPIO_Pin_13); key = 1; break; // 第二次按下 case 1: // 设置LED闪烁 key = 2; break; // 第三次按下 case 2: // 熄灭LED GPIO_ResetBits(GPIOC, GPIO_Pin_13); key = 0; break; default: break; } } // 如果按键已经按下,开始闪烁LED if (key == 2) { count++; if (count == 1000) { GPIO_ToggleBits(GPIOC, GPIO_Pin_13); count = 0; } } // 否则LED熄灭 else { GPIO_ResetBits(GPIOC, GPIO_Pin_13); } } } ``` 该代码中,在判断按键状态时,使用了switch语句来判断按键状态,根据不同的状态执行不同的操作。同时,将闪烁LED的状态设置为2,以便在闪烁LED的循环中执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值