記得學習C語言的時候,老師教for循環語句舉例時就是級數求和(大概很多C教程都喜歡用這個例子的吧)。
而且考試時試卷上經常都會有這道題目,于是很多同學幾乎是把整個程序段背下來,現在回想一下還真覺得有點搞笑的味道:)
說起來也不能怪俺們的老師和同學啊,俺們國家的教育就是這樣,沒辦法啊,誰叫俺們都是中國人呢,呵呵(沒有崇洋的味道啊,只是對俺們國家的教育頗有微詞啦)。
那時侯我們的標準程序段是這樣的:
∑N = 1 + 2 ... N
int main()
{
int i, sum = 0;
for(i = 1;i < N;i ++)sum += i;
printf("1-N的級數和是: %i",sum);
return 0;
}
這個標準還是我“制定”的啦,全班2/3的同學都用俺的標準應付老師和試卷,哈哈(成就感?!)。
這個標準是我知道的第一個知道求級數和的方法!
后來,學數據結構的排序方法時,因為書上講到冒泡、選擇還有個什么排序法來著,循環次數正好就是一個級數和,就想知道到底會是多少次循環?
于是發奮圖強(發糞涂墻?),可能是我比別人笨,我硬生生研究了一天才得出一個公式:
∑N = (N ^ 2) / 2 + N / 2
可是當我公布我的發現時,遭受了沉重的打擊:有人說中學時學過這個公式了(我汗顏,怎么我就不記得中學課本上有這個公式啊?哪位同仁中學時學過這個公式告訴俺一聲啊,這事俺如今還耿耿如懷呢?!)。
不過不管怎么樣,我總算是知道了第二種方法:
int main()
{
float sum;
sum = (N ^ 2) / 2 + N / 2;
printf("1-N的級數和是: %i",(int)sum);
return 0;
}
再就是今天和女友無意間說起這個話題,竟然又讓我發現了另外一種更簡單的方法(天才?笨蛋?):
∑N = N * (N / 2 + 0.5)
呵呵,是不是有點像上一個公式的簡化公式啊?!
俺沒有去做簡化啦,也沒有去驗證(主要是不記得怎么去簡化了啦),哈哈。
終于,第三種方法出爐了:
int main()
{
float sum;
sum = N * (N / 2 + 0.5);
printf("1-N的級數和是: %i",(int)sum);
return 0;
}
呵呵,也不知道會不會有更簡單的方法。
此文純屬無聊之作啦(有人會像偶一樣無聊嗎?!),哈哈!!!
這個是中學的很普通的公式.看來你的數學........
你考慮一個很簡單的問題:2的19999999999999999999次方等于多少?需要所有的精度值,這樣才能考驗一個人。
n*(n/2+0.5)
不過樓主換一種思維方式,其實還是不錯的。
從sum = (N ^ 2) / 2 + N / 2 到 sum = N * (N / 2 + 0.5)
博主是信手寫來,還是?
同樣是誤人子弟,如果我面試這樣的應聘者,我寧可要能給我一個循環的家伙。
博主的程序絕對沒有經過測試,或者說你根本不會如何測試程序
沒想到你竟然直接把數學公式往程序里面丟?
一笑而過……
再說一句,不要把每經過嚴格測試的成提交到網上,誤人不淺,因為有些初學著會拿著你的程序轉,結果弄半天沒得到正確結果,還以為是自己程序寫錯了。
當時確實只測試過第一個例子。看了樓上兩位的回復,我又測試了下面的兩個例子,但是只有第二段不能正常運行。
下面進行修復:
1,三段代碼中的 N 都是一個常量,程序中沒有給出具體值。
在測試之前可以加入:const int N = 100;
2,第二個段代碼的修正:
const int N = 100;
int main()
{
float sum;
sum = pow(N, 2) / 2 + N / 2;
printf("1-N的級數和是: %i",(int)sum);
return 0;
}
最后,我在標題和文章中都聲明了:無聊之舉,所以不能作為學術參考的。
當然,本人其他的技術類型文章則是經過嚴格測試的。
相信其他的文章對初學者是必定有用的。
--真的測試過了嗎?怎么測試的?
for(i = 1;i < N;i ++)sum += i;
這個N到底加了沒有?
我這兒有一篇《也說說級數求和(1+2+3...N)和其他》http://www.shnenglu.com/Fox/archive/2007/12/21/simple_series_sum.html
可資斧正
int main()
{
int n,answer=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
answer+=i;
printf("%d\n",answer);
return 0;
}
int main()
{
int n;
scanf("%d",&n);
if (n%==0) n=(n++)*(n/2);
else n=(n*((n--)/2)+n);
printf("%d\n",n);
return 0;
}