Board logo

标题: 做一个1+2+3+4+5+.....100的程序的多种办法 [打印本页]

作者: 小树    时间: 2008-9-29 09:28     标题: 做一个1+2+3+4+5+.....100的程序的多种办法

做一个1+2+3+4+5+.....100的程序的多种办法
#include<iostream>
using namespace std;
int main()  
{  
int a,sum=0;  
for(a=1;a<=100;a++)  
sum=sum+a;  
cout<<sum;
return 0;
}

~~~~~~~~~~~~~~~~~~~~~~~~~~

实际上当问题具体到这个程度时,可以直接:
#include <iostream>

int main()
{
     std::cout << 5050 << endl;
     return 0;
}

另一种效率高(相对于循环来说)的方法是:
#include <iostream>

int main()
{
     std::cout << 100 * 101 / 2 << endl;
     return 0;
}

当然,最容易想到的还是循环:
#include <iostream>


int main()
{
     int n = 0;
     for (int i = 0; i < 100; n += ++i);
     std::cout << n << endl;
     return 0;
}  

  
作者: Leeroy  2007-1-5 17:35    


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


#include <iostream>
int main()
{
int sum = 0;
for ( int i = 0; i <= 100; ++i )
sum += i;
std::cout << sum << std::endl;
return 0;
}  




~~~~~~~~~~~~~~~~~~~~~~~~~~~~


!=不好,提倡用<=.

!=只在某一特殊点才能退出循环,而<=是在一个范围。你要是for(i=1;i!=100;i+=2)不就是死循环了吗?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这个问题已经具体到这种程度了,那我认为直接输出5050当然是最好的方法,因为你并不是要一个算法,而只是要一个结果——既然我知道结果,为什么还要再推一遍?难道你们做数学题的时候从不用定理而是用公理解么?显然是不可能的



如果确实要求1到n的和,那么最笨的方法是用循环累加。实际上,我们为什么不让自己聪明点?至少高斯可不像他的老师一样:
(下面是我自己的解法,[]表示下标,看不懂可抄纸上)
等差数列前n项和公式n*a[1]+n*(n-1)*d/2
其中d=1,a[1]=1
显然,最后一个数即为n,那么原式即化为
n+n*(n-1)/2
提出n/2,原式可再化简为
n*(n+1)/2
——————————我是朴实的分割线——————————
这就是先行的计算1到n的和的在计算机上的最优算法了,它拥有常数时间的复杂度而不是循环累加的线性时间;而其中的除二在整数类型中更是可以优化为右移运算,效率极高  
#include <iostream>

int main()
{
     std::cout << 100 * 101 / 2 << std::endl;
     return 0;
}林子的江南小居


新BLOG,欢迎大家去踩点……
[/url] [url=http://edit.yahoo.com/config/send_webmesg?.target=herj001@yahoo.com.cn&.src=pg]
作者: buding28798    时间: 2009-3-29 11:34

hehe  ding ge
作者: wufeideai    时间: 2009-7-3 14:07

数据结构里对算法很重视哦




欢迎光临 【3.A.S.T】网络安全爱好者 (http://3ast.com./) Powered by Discuz! 7.2