- 帖子
- 14
- 积分
- 22
- 威望
- 30
- 金钱
- 28
- 在线时间
- 0 小时
|
做一个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] |
|