題目
有n個燈排成一排,開始全部爲滅。有n個學生,第一個學生把所有是1倍數的燈開關按一下(燈打開),此時所有燈都打開;第二個學生把所有是2倍數的燈按一下開關(開啓變爲關閉,關閉變爲開啓);第三個學生把所有是3 倍數的燈按一下……,以此內推,直到第n個同學把所有是n倍數的燈按一下開關。
注:燈只有兩種狀態,開啓和關閉,開啓狀態按一下可以轉換爲關閉狀態,關閉狀態按一下可以轉換爲開啓狀態。
解答
對於一個燈,無論按多少次開關,只要是按的開關總次數是奇數,那麼這個燈最終就是開啓狀態;只要是按的開關總次數是偶數,那麼這個燈最終就是關閉狀態。
一個燈被按的次數就是這個燈編號的因數的個數,要求有多少個燈亮着就是有多少個燈編號的因數個數是奇數。一個數的因數有奇數個,即這個數的因數是左右對稱,同時中間有一個,即X×Y=n,當X=Y時,有一個值。也就是一個完全平方數。
推導得到:求n個數中完全平方數的個數。
代碼
C語言程序實現
int getPerfectSquare(int n){
int sum = 0; // 完全平方數的個數
int i;
for(i=1; i<=n; i++){
if(i*i>n){
break;
}
// 打印得到的完全平方數
printf("%d * %d = %d\n", i,i,i*i);
++sum;
}
return sum;
}
擴展:
完全平方數問題