歐拉計划之題目1:找出1000以下自然數中3和5的倍數之和。


本題來自歐拉計划: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式;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM