C指针原理(71)-C快速入门(6)
2014-01-23 18:10
288 查看
(6)自动猜数算法
能不能让电脑程序拥有智能,让程序来猜数字呢?肯定可以,通过一定的算法就能实现。什么是算法?
算法在中国古代文献中称为“术”,最早出现在《周髀算经》、《九章算术》。特别是《九章算术》,给出四则运算、最大公约数、最小公倍数、开平方根、开立方根、求素数的埃拉托斯特尼筛法,线性方程组求解的算法。三国代的刘徽给出求圆周率的算法:刘徽割圆术。
欧几里得算法被人们认为是史上第一个算法。第一次编写程序是Ada Byron于1842年为巴贝奇分析机编写求解解伯努利微分方程的程序,因此Ada Byron被大多数人认为是世界上第一位程序员。
算法的核心是创建问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。
为了能让程序实现自动猜数,必须假设一个前提:程序不知道要猜的数字,也就是说这个算法中只能与要猜的数字进行比较,而不能直接“知道”要猜的数字值。可将算法设计如下:
第一步,设数字范围R为1-500。
第二步,取范围R以内的中间值A,把A作为程序模仿人类猜测出的数字。
第三步,将猜测的数字A与被猜的结果B比较
(1)如果A>B,则将R的上限设为A,回到第二步。
(2)如果A<B,则R的下限设为A ,回到第二步。
(3)如果A=B,则退出程序,提示猜中数字,进入第四步。
第四步,在屏幕上输出A和B,并提示猜中数字。
根据上面的算法来编写以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//code:myhaspl@myhaspl.com
//date:2014-01-23
//未与作者书面联系,请勿将本程序用于任何用途
int getnumber(){
srand((int)time(0));
return rand()%499+1;
}
int main(){
int mynum;
int ispass=0;
int guessnum=getnumber();
int myrange[2]={1,500};
while (1){
mynum=(myrange[0]+myrange[1])/2;
if (mynum>guessnum){
printf("程序猜的数字为%d,数字大了!\n",mynum);
myrange[1]=mynum;
}
else if(mynum<guessnum){
printf("程序猜的数字为%d,数字小了!\n",mynum);
myrange[0]=mynum;
}
else{
printf("程序猜的数字为%d, 被猜的数字为%d,猜中了!\n",mynum,guessnum);
break;
}
}
}
运行后,结果为:
dp@dp:~/cquick % gcc guessnum.c -o myguess
dp@dp:~/cquick % ./myguess
程序猜的数字为250,数字大了!
程序猜的数字为125,数字小了!
程序猜的数字为187,数字大了!
程序猜的数字为156,数字小了!
程序猜的数字为171,数字大了!
程序猜的数字为163,数字小了!
程序猜的数字为167, 被猜的数字为167,猜中了!
dp@dp:~/cquick %
能不能让电脑程序拥有智能,让程序来猜数字呢?肯定可以,通过一定的算法就能实现。什么是算法?
算法在中国古代文献中称为“术”,最早出现在《周髀算经》、《九章算术》。特别是《九章算术》,给出四则运算、最大公约数、最小公倍数、开平方根、开立方根、求素数的埃拉托斯特尼筛法,线性方程组求解的算法。三国代的刘徽给出求圆周率的算法:刘徽割圆术。
欧几里得算法被人们认为是史上第一个算法。第一次编写程序是Ada Byron于1842年为巴贝奇分析机编写求解解伯努利微分方程的程序,因此Ada Byron被大多数人认为是世界上第一位程序员。
麦好的AI乐园博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
算法的核心是创建问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。为了能让程序实现自动猜数,必须假设一个前提:程序不知道要猜的数字,也就是说这个算法中只能与要猜的数字进行比较,而不能直接“知道”要猜的数字值。可将算法设计如下:
第一步,设数字范围R为1-500。
第二步,取范围R以内的中间值A,把A作为程序模仿人类猜测出的数字。
第三步,将猜测的数字A与被猜的结果B比较
(1)如果A>B,则将R的上限设为A,回到第二步。
(2)如果A<B,则R的下限设为A ,回到第二步。
(3)如果A=B,则退出程序,提示猜中数字,进入第四步。
第四步,在屏幕上输出A和B,并提示猜中数字。
根据上面的算法来编写以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//code:myhaspl@myhaspl.com
//date:2014-01-23
//未与作者书面联系,请勿将本程序用于任何用途
int getnumber(){
srand((int)time(0));
return rand()%499+1;
}
int main(){
int mynum;
int ispass=0;
int guessnum=getnumber();
int myrange[2]={1,500};
while (1){
mynum=(myrange[0]+myrange[1])/2;
if (mynum>guessnum){
printf("程序猜的数字为%d,数字大了!\n",mynum);
myrange[1]=mynum;
}
else if(mynum<guessnum){
printf("程序猜的数字为%d,数字小了!\n",mynum);
myrange[0]=mynum;
}
else{
printf("程序猜的数字为%d, 被猜的数字为%d,猜中了!\n",mynum,guessnum);
break;
}
}
}
麦好的AI乐园博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
运行后,结果为:dp@dp:~/cquick % gcc guessnum.c -o myguess
dp@dp:~/cquick % ./myguess
程序猜的数字为250,数字大了!
程序猜的数字为125,数字小了!
程序猜的数字为187,数字大了!
程序猜的数字为156,数字小了!
程序猜的数字为171,数字大了!
程序猜的数字为163,数字小了!
程序猜的数字为167, 被猜的数字为167,猜中了!
dp@dp:~/cquick %
相关文章推荐
- C指针原理(68)-C快速入门(1)
- C指针原理(69)-C快速入门(2)
- C指针原理(70)-C快速入门(3)
- 容斥原理、鸽巢原理快速入门
- C语言快速入门之指针
- Spring Boot实战与原理分析之快速入门
- Hibernate 原理 快速入门 详解 经典总结
- Hibernate 的原理与配置快速入门
- C++快速入门 (四) 引用 和 指针
- this指针和类的继承 - C++快速入门16
- XenStore:使用,结构和原理(1. 快速入门)
- 几张图帮你理解 docker 基础原理及快速入门
- this指针和类的继承 - C++快速入门16
- 快速入门Http协议和Tomcat服务器的原理
- 1.搜索引擎的历史,搜索引擎起步,发展,繁荣,搜索引擎的原理,搜索技术用途,信息检索过程,倒排索引,什么是Lucene,Lucene快速入门
- 1.搜索引擎的历史,搜索引擎起步,发展,繁荣,搜索引擎的原理,搜索技术用途,信息检索过程,倒排索引,什么是Lucene,Lucene快速入门
- 快慢指针原理--快速找到未知长度单链表的中间节点
- Hibernate 的原理与配置快速入门
- API hook原理和实例快速入门(inline hook),以dll线程注入方式使用(win7-64bit)
- C指针原理(71)-C快速入门(5)