《趣学算法》:算法之美

算法贯穿于我们生活,做事的步骤,结论的判断,时间的计算······其实都在用算法。

数据结构+算法=程序(瑞典著名科学家N.Wirth教授)

算法是指对特定问题求解步骤的一种描述。它不依赖于任何一种语言,既可以用自然语言、程序设计语言(C、C++、Java、Python等)描述,也可以用流程图、框图来表示。
算法的特性:
(1)有穷性。
(2)确定性。
(3)可行性
(4)输入输出。

  1. 趣味故事1-1:一盘棋的麦子(爆炸增量函数)

曾经有位公主不幸落入鳄鱼潭,国王下令谁救回公主就可以迎娶公主。一位勇敢的小伙子挺身而出,但国王因为他是个穷小子想反悔,让他另外提要求。小伙子就提出“只要一棋盘的麦子。在第1个格子里放1粒麦子,第2个格子里放2粒,第3个格子里放4粒,第4个格子里放8粒,以此类推,每个格子里的麦子粒数都是前一格的两倍。把64个格子都放好就行,我就要这么多。”国王听后哈哈大笑,觉得要求很容易满足,满口答应。结果发现,把全国的麦子拿出来都填不满64个格子······国王无奈,只好把女儿嫁给了这个小伙子。

  1. 趣味故事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. 趣味故事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. 趣味故事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. 趣味故事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;
}

猜你喜欢

转载自blog.csdn.net/qq_34624515/article/details/84537142
今日推荐