本題來自歐拉計划:http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/2-1100035
1 #include <stdio.h> 2 3 void main() 4 { 5 int sum=0,i; 6 for(i=3;i<=999;i++) 7 { 8 if((i%3==0)&&(i%5!=0)) //被3除盡,不被5除盡的數 9 sum+=i; 10 if(i%5==0) //被5除盡,同時也能被3除盡的數 11 sum+=i; 12 } 13 printf("%d\n",sum); 14 }
感悟:每做一道題,需要考慮這道題有兩點:時間復雜度和空間復雜度。怎樣才能使一段代碼最優化,是一個問題。
這道題看似簡單,難點是在於同時能被3和5整除的數,如15,這樣15就會被加兩次。
補充:
1 #include <stdio.h> 2 3 void main() 4 { 5 int sum=0,i; 6 for(i=3;i<=999;i+=3) 7 if((i%3==0)&&(i%5!=0)) //被3除盡,不被5除盡的數 8 sum+=i; 9 for(i=5;i<=995;i+=5) 10 if(i%5==0) //被5除盡,同時也能被3除盡的數 11 sum+=i; 12 printf("%d\n",sum); 13 } 14 15 //用這個算法,比先前的算法好。在數據多的時候,難道真的要一個一個的搜嗎? 16 //雖然這里的數很少,但是起碼最先的算法浪費時間,
等一下,還有更優的算法,時間復雜度為1。回頭看看自己的垃圾代碼,真心的慘不忍睹。
1.1000以內3的倍數:3+6+9+…+999=3*(1+2+3+...+333)=3*(1+333)*333/2;
2.1000以內5的倍數:5+10+15+...+995=5*(1+199)*199/2;
3.1000以內15的倍數(15被加了2次,所以減去1次):15*(1+66)*66/2;
所以最后答案為:1式+2式-3式;