小天狼星打算逃出阿兹卡班了。众所周知,阿兹卡班是一个从来没人能够逃出的监狱。因为每个囚徒都是单独牢房,且牢房内设施简陋。然而法力高强的小天狼星发明了一个强大又神奇的魔法。阿兹卡班一共关押了n个囚徒,且这个魔法能够让摄魂怪进行n次操作牢房房门开关,且第i次操作只能把编号为i的倍数的牢房门打开或者关闭。现在我们知道囚徒数n。求n次操作后,牢房门打开的牢房有多少个?
正整数n(1<n<=10^6)。多组输入,直到EOF结束。
每行输出一个正整数,对应每个n。
思路:
1) 暴力破解
对于这样的问题 最先想到的当然是暴力循环了。 用一个装有1000000个元素的数组 代表这1000000扇牢门。暴力循环 每按一次魔法对应元素的值变换一次。(但是本题的n比较大,直接循环会超时)。
2) 通过题意 我们知道 每次按的 都是次数的 倍数 所以 我们可以通过求公约数来实现
例如: 编号为12 的灯牢门在 第1,2,3,4,,6,12次被操作而 12=1*12=2*6=3*4一共按了6次 (偶数次 )所以最后是关着的 。
编号为9的牢门 在第1,3,9次被按下 一共按了奇数次 所以最后牢门是开着的。
3) 通过思路2我们知道了 最后亮灯的都是按了奇数次的灯。在求约数时 因为:N=a*b 有了a就有b 为了为奇数 a的等于b 。 所以 最后等亮着的是完全平方的数 。
1 #include<stdio.h> 2 #include<math.h> 3 int main(){ 4 int n; 5 while(scanf("%d",&n)!=EOF){ 6 printf("%d\n",(int)sqrt(n)); 7 } 8 }
原文:https://www.cnblogs.com/CSA01/p/13222268.html