C 说说折半查找(二分法)
学校的一道上机题:
编写程序,在整数数组中设置10个值(例如学生年龄),然后从键盘输入一个要查找的年龄,并输出查找结果。
[提示]可以利用标志变量表示查找的结果。
因为无聊,所以就用了折半查找,上次说【两分法】被鄙视了,所以这真的是二分法啦。
首先二分法需要先排序,排序可以用各种函数,也可以用冒泡排序,以前我写过关于冒泡排序(PHP实现冒泡排序),因此这里对冒泡排序是什么不多做解释,直接上代码。
学校的一道上机题:
编写程序,在整数数组中设置10个值(例如学生年龄),然后从键盘输入一个要查找的年龄,并输出查找结果。
[提示]可以利用标志变量表示查找的结果。
因为无聊,所以就用了折半查找,上次说【两分法】被鄙视了,所以这真的是二分法啦。
首先二分法需要先排序,排序可以用各种函数,也可以用冒泡排序,以前我写过关于冒泡排序(PHP实现冒泡排序),因此这里对冒泡排序是什么不多做解释,直接上代码。
题目:
编写一个函数,返回一个double数组中最大的和最小的数之间的差值,并在一个简单的程序中测试这个函数。
对于题目无感,很容易,只是有一点疑惑,因为答案写的时候是
printf("The gap between max and min is: %g\n",gap( array, WIDTH));
感觉很神奇,%g
是什么?在我的笔记-说明符中并没有记录,然后翻到书上的章节里,也没有详细介绍,只是把它归类为解释成浮点型。
结果输出:
2.6
9.2
The dif between max and min is : 6.6
没有多余的0,看着很舒服。
个人用的方法,感觉还不错:
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteBase /poster
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [QSA,L]
</IfModule>
如果在根目录,那么把/poster
改成/
就行了,如果在http://xxx.xxx/aaa 则把/poster
改成/aaa
注:
第1行 第9行 判断rewrite模块是否加载,没有加载的话这几行代码不起作用
第2行设置Linux软连接
以上几行去掉无妨。
题目:
函数power()的功能是返回一个double类型数的某个正整数次幂。现在改进该函数,使其能正确地计算负幂。同时,用该函数实现0的任何次幂为0,并且任何数值的0次幂为1。使用循环的方法编写该函数并在一个程序中测试它。
递归在C 关于递归中讲过了一些知识,但是在写的时候我还是遇到了一些麻烦,而普通的循环却比较好想。
这里我们以get
与分页的结合为例,因为这点当时我纠结了很久,当然是在M-SHOW
时候纠结完的,这次拿来主义了一次,记录一下。
$this->load->library('pagination');
$id = $this->input->get('id');
/**
* pagination
*/
$config['base_url'] = base_url().'poster_admin/works/search';
$config['per_page'] = 5;
$config['num_links'] = 7;
$config['uri_segment'] = '4';
$config['use_page_numbers'] = TRUE;
$config['full_tag_open'] = '<ul class="pagination">';
$config['full_tag_close'] = '</ul>';
$config['cur_tag_open'] = '<li class="active"><a href="#">';
$config['cur_tag_close'] = '</a></li>';
$config['num_tag_open'] = '<li>';
$config['num_tag_close'] = '</li>';
$config['prev_tag_open'] = '<li>';
$config['prev_tag_close'] = '</li>';
$config['next_tag_open'] = '<li>';
$config['next_tag_close'] = '</li>';
$config['first_link'] = FALSE;
$config['last_link'] = FALSE;
$config['total_rows'] = $this->works_model->searchNum($id);
$config['suffix'] = '?id='.$this->input->get('id');
$config['first_url'] = base_url().'poster_admin/works/search'.'?id='.$this->input->get('id');
$this->pagination->initialize($config);
这次顺便做了一个install.php
才发现难度其实并不大,还是文件写入操作而已,安装其实主要操作的还是数据库里的内容,先来看看文件里怎么写:(还是用的Codeigiter,对于使用其他框架或者手写而言,仅思路可参考,用了挺多CI自带的helper
或者是library
的)
$content = "<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\n";
$content .= '$active_group'. "= 'default';\n";
$content .= '$active_record'." = TRUE;\n";
$content .= '$db'."['default']['hostname'] = '".$this->input->post('hostname')."';\n";
$content .= '$db'."['default']['username'] = '".$this->input->post('rootname')."';\n";
$content .= '$db'."['default']['password'] = '".$this->input->post('pass')."';\n";
$content .= '$db'."['default']['database'] = '".$this->input->post('book')."';\n";
$content .= '$db'."['default']['dbdriver'] = 'mysql';\n";
$content .= '$db'."['default']['dbprefix'] = '';\n";
$content .= '$db'."['default']['pconnect'] = TRUE;\n";
$content .= '$db'."['default']['db_debug'] = TRUE;\n";
$content .= '$db'."['default']['cache_on'] = FALSE;\n";
$content .= '$db'."['default']['cachedir'] = '';\n";
$content .= '$db'."['default']['char_set'] = 'utf8';\n";
$content .= '$db'."['default']['dbcollat'] = 'utf8_general_ci';\n";
$content .= '$db'."['default']['swap_pre'] = '';\n";
$content .= '$db'."['default']['autoinit'] = TRUE;\n";
$content .= '$db'."['default']['stricton'] = FALSE;";
在文件里用\n
来换行,因为里面包括了PHP的代码,这导致了我们只能用双引号避免冲突(否则的话就得用\
了,感觉工作量更大),针对$db
,直接显示必须要用单引号,于是就出现了这个。
题目:
用两分搜索策略来猜数字(1-100),比如程序最初猜50,让其询问用户该猜测是大还是小,如果猜测值小,那么下一次猜测值为50-100的中值。
两分法查找的思路+练习输入输出,为了作为一个游戏增强一下卖萌性所以……还是先来看看源码吧
题目:
输入不知道多少个 [0, 100] 间的整数(直到 -1 结束)[100独立成一段]
以每 10 分为一段([0, 10), [10, 20)...),输出每一区间内整数的个数
很简单的题目……感动哭了(然后自己作死就得到了杨辉三角和分解素因数→不作死就不会死系列)
#include <stdio.h>
int main(void)
{
int num, i, count[11];
for (i = 0; i <= 10; i++)
count[i] = 0;
printf("请输入[0,100]的数\n");
scanf("%d", &num);
while (num != -1) {
if(num >= 0 && num <=100)
count[num / 10]++;
else
printf("请输入正确范围的数字\n");
printf("请输入[0,100]的数\n");
scanf("%d", &num);
}
for (i = 0; i <= 10; i++)
printf("%5d", count[i]);
return 0;
}
经过一道杨辉三角的题,总算差不多知道了关于递归的几个问题。
- 递归里怎么看return
- 为什么说递归效率低,能不用就不用
方便阅读期间,我们直接在这里再次贴出代码:
#include <stdio.h>
int Yang(int row, int col)
{
int len = row;
if (row == 1 || col == 1 || col == len)
return 1;
if (col > len)
return 0;
return Yang(row - 1, col - 1) + Yang(row - 1, col);
}
int main(void)
{
int row, i;
scanf("%d", &row);
for (i = 1; i <= row; ++i)
printf("%d ", Yang(row, i));
printf("\n");
return 0;
}