算法贯穿于我们生活,做事的步骤,结论的判断,时间的计算······其实都在用算法。
数据结构+算法=程序(瑞典著名科学家N.Wirth教授)
算法是指对特定问题求解步骤的一种描述。它不依赖于任何一种语言,既可以用自然语言、程序设计语言(C、C++、Java、Python等)描述,也可以用流程图、框图来表示。
算法的特性:
(1)有穷性。
(2)确定性。
(3)可行性
(4)输入输出。
- 趣味故事1-1:一盘棋的麦子(爆炸增量函数)
曾经有位公主不幸落入鳄鱼潭,国王下令谁救回公主就可以迎娶公主。一位勇敢的小伙子挺身而出,但国王因为他是个穷小子想反悔,让他另外提要求。小伙子就提出“只要一棋盘的麦子。在第1个格子里放1粒麦子,第2个格子里放2粒,第3个格子里放4粒,第4个格子里放8粒,以此类推,每个格子里的麦子粒数都是前一格的两倍。把64个格子都放好就行,我就要这么多。”国王听后哈哈大笑,觉得要求很容易满足,满口答应。结果发现,把全国的麦子拿出来都填不满64个格子······国王无奈,只好把女儿嫁给了这个小伙子。
- 趣味故事1-2:神奇兔子数列(斐波那契数列)
假设第1个月有1对刚诞生的兔子, 第2个月进入成熟期,第3个月开始生育兔子,而1对成熟的兔子每月会生1对兔子,兔子用不死去······那么,由1对初生兔子开始,12个月后会有多少对兔子?
兔子数列即斐波那契数列,它的发明者是意大利数学家列昂那多·斐波那契(Leonardo Fibonacci,1170-1250)。1202年,他撰写了《算盘全书》(《Liber Abaci》)一书,该书是一部较全面的初等数学著作。书中系统地介绍了印度—阿拉伯数码及其演算法则,介绍了中国的 “盈不足术”;引入了负数,并研究了一些简单的一次同余式组。
Fib(int n){
int i,s1,s2;
if(n<1)
return -1;
if(n==1||n==2)
return 1;
s1=1;
s2=1;
for(i=3;i<n;i++){
s2=s1+s2; //辗转相加法
s1=s2-s1; //记录前一项
}
return s2;
}
- 趣味故事1-3:马克思手稿中的数学
马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,这些人在一家饭馆吃饭花了50先令;每个男人花3先令,每个女人花2先令,每个小孩花1先令,问男人、女人和小孩各有几人?
#include<iostream>
int main(){
int x,y,z,count=0; //记录可行解的个数
cout<< " Men,Women,Children" <<endl;
cout << "............" <<endl;
for(x=1;x<=9;x++){
y=20-2*x;
z=30-x-y;
if(3*x+2*y+z==50){
cout << ++count << " " <<x<<y<<z<<endl;
}
return 0;
}
}
- 趣味故事1-4:爱因斯坦的阶梯
爱因斯坦家里有一条长阶梯,若每步跨2阶,则最后剩1阶;若每步跨3阶,则最后剩2阶;若每步跨5阶,则最后剩4阶;若每步跨6阶,则最后剩5阶。只有每次跨7阶,最后才正好1阶不剩。请问这条阶梯共有多少阶?
#include<iostream>
int main(){
int n=7; //n为所设的阶梯数
while(!((n%2==1)&&(n%3==2)&&(n%5==4)&&(n%6==5)&&(n%7==0)))
n=n+7;
cout<< "Count the stairs = "<< n <<endl; //输出阶梯数
return 0;
}
- 趣味故事1-5:哥德巴赫猜想
哥德巴赫猜想:任一大于2的偶数,都可表示成两个素数之和。
验证:2000以内大于2的偶数都能够分解为两个素数之和。
#include <math.h>
int prime(int n); //判断是否均为素数
int main(){
int i,n;
for(i=4,i<=2000;i+=2){ //对2000大于2的偶数分解判断,从4开始,每次赠2
for(n=2;n<i;n++) //将偶数i分解为两个整数,一个整数是n,一个是i-n
if(prime(n)) //判断第一个整数是否均为素数
if(prime(i-n)){ //判断第二个整数是否均为素数
cout<< i << "=" << n << "+"<< i-n <<endl; //若均为素数则输出
break;
}
if(n==i)
cout<< "error" <<endl;
}
}
int prime(int i){ //判断是否为素数
int j;
if(i<=1) return 0;
if(i==2) return 1;
for(j=2;j<=(int)(squrt((double)i));j++)
if(!(i%j)) return 0;
return 1;
}