我做這在C:計算從1到n的所有偶數平方的最快方法?
#include<stdio.h>
int main (void)
{
int n,i;
scanf("%d", &n);
for(i=2;i<=n;i=i+2)
{
if((i*i)%2==0 && (i*i)<= n)
printf("%d \n",(i*i));
}
return 0;
}
什麼是解決這個問題的一個更好/更快的方法呢?
我做這在C:計算從1到n的所有偶數平方的最快方法?
#include<stdio.h>
int main (void)
{
int n,i;
scanf("%d", &n);
for(i=2;i<=n;i=i+2)
{
if((i*i)%2==0 && (i*i)<= n)
printf("%d \n",(i*i));
}
return 0;
}
什麼是解決這個問題的一個更好/更快的方法呢?
讓我說明不僅是一個快速解決方案,而且還說明如何推導它。開始列出了所有方塊的快捷方式,並從那裏工作的(僞):
max = n*n
i = 1
d = 3
while i < max:
print i
i += d
d += 2
所以,從4日起,上市僅甚至廣場:
max = n*n
i = 4
d = 5
while i < max:
print i
i += d
d += 2
i += d
d += 2
現在我們可以縮短上那些亂七八糟while循環的結束:
max = n*n
i = 4
d = 5
while i < max:
print i
i += 2 + 2*d
d += 4
需要注意的是,我們經常使用2*d
,所以最好只保留計算如下:
max = n*n
i = 4
d = 10
while i < max:
print i
i += 2 + d
d += 8
現在注意,我們會不斷地添加2 + d
,所以我們可以做到通過結合這更好的爲d
:
max = n*n
i = 4
d = 12
while i < max:
print i
i += d
d += 8
速度極快。它只需要兩個添加來計算每個平方。
像老闆一樣! :d –
我喜歡你的解決方案。唯一的建議,我會做是:
(i*i)<=n
作爲你的for循環,那麼它的早期檢查的中間子句和你跳出循環越快的。(i*i)%2==0
,因爲'我'總是積極的,正方形總是正數。thanx的平方根來限制你的循環:D –
甚至是平方。所以,你真的不需要再檢查一次。以下是代碼,我會建議:
for (i = 2; i*i <= n; i+=2)
printf ("%d\t", i*i);
循環中i
的最大值應該是n
的平方根的底線。
其原因是,任何i
(整數)的比這大的正方形將比n
更大。所以,如果你做這個改變,你不需要檢查i*i <= n
。
另外,正如其他人指出的那樣,檢查i*i
是否爲,即使是也沒有意義,因爲所有偶數的平方都是偶數。
而且你是正確的,因爲忽略奇i
任何奇i
,i*i
爲奇數。
你與上述的變化的代碼如下:
#include "stdio.h"
#include "math.h"
int main()
{
int n,i;
scanf("%d", &n);
for(i = 2; i <= (int)floor(sqrt(n)); i = i+2) {
printf("%d \n",(i*i));
}
return 0;
}
(I * I)%2 == 0當且僅當設爲i%2 == 0,因爲即使*甚至=偶數和奇數*奇數=奇數。因此,您可以從if中刪除(i * i)%2 == 0,並保存i * i的計算時間。 – LeeNeverGup
你可能想要使用無符號整數,你可以通過取N: – GWW