6。1编写一个函数,它在一个字符串中进行搜索,查找所有在一个给定字符集中出现的字符,返回第一个找到的字符位置指针,未找到返回NULL

#include <stdio.h>

char * find_char(char const *source, char const *chars)
{
char const *sptr = source;
char const *cptr = chars; if (sptr == NULL || cptr == NULL) {
return NULL;
} while (*sptr != '\0') {
cptr = chars;
while (*cptr != '\0') {
if (*cptr == *sptr) {
                   //找到打印source地址
printf("chars:0x%p\n", chars);
//返回类型为 char *,此处类型转换一下把char const *转换回来
return (char *)cptr;
}
cptr++;
}
sptr++;
} return NULL;
}

 

#include <stdio.h>
#include "function.h" int main()
{
char *source = "ABCDEF";
char *str1 = "XYZ";
char *str2 = "XRCQEF";
char *chars = str1;
char *ptr = NULL;
//没有对应的字符
ptr = find_char(source, chars);
printf("0x%p\n", ptr);
//对应的字符C,第三个
chars = str2;
ptr = find_char(source, chars);
printf("0x%p\n", ptr); while (1)
;
return 0;
}

  执行结果:

6.2删除字符串中子串部分,将剩下部分前移。

int del_substr(char *str, char const *substr)
{
if (str == NULL || substr == NULL) {
return 0;
}
   //将数组首位赋值给指针数组
char *source = str;
char *sub = substr;
char *tmp = NULL; while (*source != '\0') {
//将指针重置指向子串首
sub = substr;
//使用临时变量进行对比,保持source位置信息不变
tmp = source;
//当遇到相同的字符,开始比较之后是否相同
while (*tmp++ == *sub++) {
//循环中已经sub++了,到达末尾,证明找到子串,开始前移
if (*sub == '\0') {
//未到达字符串末尾,继续前移
while (*(tmp + 1) != '\0') {
*source = *tmp;
}
return 1;
}
}
source++;
}
return 0;
}
int main()
{
char *source = "ABCDEF";
char *str1 = "CGE";
char *str2 = "CDE";
int isDel;
//无子串
isDel = del_substr(source, str1);
printf("del_substr: %d\n", isDel);
//有子串
isDel = del_substr(source, str2);
printf("del_substr: %d\n", isDel); while (1)
;
return 0;
}

执行结果:

6.3 编写函数reverse_string,翻转字符串。

void reverse_string(char *string)
{
//先定义两个指针,一个指向首一个指向末尾
char *head = string;
//string本身指向第一位,加上字符串长度后是指向\0后的,所以需要前移,指向最后一个字符
char *tail = string + strlen(string) - 1;
char tmp; //同一数组内可以进行指针位置对比
while (head < tail) {
tmp = *head;
*head = *tail;
*tail = tmp;
head++;
tail--;
}
} int main()
{
char source[] = "ABCDEF";
printf("source: %s\n", source); reverse_string(source);
printf("result: %s\n", source); return 0;
}

  执行结果:

6.4 Eratosthenes法找质数,第一步写下2至某个上线之间的所有的数,第二步开始剔除不是质数的整数,找到列表第一个不被剔除的数(就是2)然后将表后面所有逢双的数都剔除,因为都可以被2整除,所以不是质数,然后回到表头,此时表头尚未被剔除的是三,然后每逢三位剔除,反复进行最后都是质数。

void find_primer(int *numbers, int length)
{
//0 1 不为质数
numbers[0] = FALSE;
numbers[1] = FALSE; int tmp;
int loc;
int index = 2; while (index < length) {
tmp = index;
//当前头部找到的质数,和后面的数相乘的结果对应的位置全部不是质数。
while ( (tmp += index) < length) {
*(numbers + tmp) = FALSE;
}
index++;
} }
int main()
{
int numbers[10000];
for (int index = 0; index < 10000; index++) {
numbers[index] = TRUE;
} find_primer(numbers, 10000); for (int index = 0; index < 10000; index++) {
if (numbers[index]) {
printf("%-08d", index);
}
} return 0;
}

  运行结果:

6.5利用第五章的位数组求质数

位数组:

//字符偏移
unsigned int char_offset(unsigned bit_number)
{
return bit_number / CHAR_BIT;
} //bit位偏移
unsigned int bit_offset(unsigned bit_number)
{
return bit_number % CHAR_BIT;
} void set_bit(char bit_array[], unsigned bit_number)
{
bit_array[char_offset(bit_number)] |= 1 << bit_offset(bit_number);
} void clear_bit(char bit_array[], unsigned bit_number)
{
bit_array[char_offset(bit_number)] &= ~(1 << bit_offset(bit_number));
} void assign_bit(char bit_array[], unsigned bit_number, int value)
{
if (value != 0) {
set_bit(bit_array, bit_number);
}
else {
clear_bit(bit_array, bit_number);
}
} int test_bit(char bit_array[], unsigned bit_number)
{
//对该bit位进行与操作,如果是1则结果还是 1<< (bit_number % CHAR_BIT)
return (bit_array[char_offset(bit_number)] & (1 << bit_offset(bit_number))) != 0;
}

位数组求质数:

void find_primer_bit(char bit_array[], unsigned long int length)
{
clear_bit(bit_array, 0);
clear_bit(bit_array, 1); unsigned int tmp;
unsigned int loc;
unsigned int index = 2; while (index < length) {
tmp = index;
//没逢index位置0
while ( (tmp += index) < length) {
clear_bit(bit_array, tmp);
}
index++;
}
}
#define MAX_LEN 1000000
#define MAX_ARR_SIZE (MAX_LEN / 8) int main()
{
char bit_array[MAX_ARR_SIZE];
unsigned int count = 0;
unsigned int index = 0;
unsigned int total = 0;
while (index < MAX_ARR_SIZE) {
bit_array[index++] = 0xff;
} find_primer_bit(bit_array, MAX_LEN); index = 1;
while (index < MAX_LEN) {
if (test_bit(bit_array, index)) {
total++;
printf("%-8d", index);
}
index++;
} printf("\n共计: %d 个质数 \n", total); return 0;
}

  

执行结果

检测一下是否正确:

1000000万内有78498个质数

6.6计算每隔1000位质数个数:

统计一下每隔100000的质数

#define MAX_LEN 1000000
#define MAX_ARR_SIZE (MAX_LEN / 8)
int main()
{
char bit_array[MAX_ARR_SIZE];
unsigned int count = 0;
unsigned int index = 0;
unsigned int total = 0;
unsigned int limit = 100000;
while (index < MAX_ARR_SIZE) {
bit_array[index++] = 0xff;
}
find_primer_bit(bit_array, MAX_LEN); index = 0;
while (index < MAX_LEN) {
if (index == limit) {
printf("%-6d %-6d avg: %5.2f\n", index - 100000, index, (float)count / 100);
count = 0;
limit += 100000;
}
if (test_bit(bit_array, index)) {
count++;
total++;
}
index++;
} printf("\n共计: %d 个质数 \n", total);
while (1)
;
return 0;
}

  

  

C和指针 第六章 习题的更多相关文章

  1. Perl语言入门:第六章习题:处理用户所指定的名字并汇报相应的姓。

    37 print "\n----------------------------------_exercise_6_1--------------------------\n";  ...

  2. C和指针 第十六章 习题

    16.8 计算平均年龄 #include <stdlib.h> #include <stdio.h> #define MAX_LEN 512 int main() { int ...

  3. C和指针 第十七章 习题

    17.8 为数组形式的树编写模块,用于从树中删除一个值,如果没有找到,程序节点 ArrayBinaryTree.c // // Created by mao on 16-9-18. // #inclu ...

  4. C和指针 第十三章 习题

    1,1标准输入读入字符,统计各类字符所占百分比 #include <stdio.h> #include <ctype.h> //不可打印字符 int isunprint(int ...

  5. C和指针 第十一章 习题

    1编写calloc,内部使用malloc函数获取内存 #include <stdio.h> #include <stdlib.h> void *myAlloc(unsigned ...

  6. C和指针 第七章 习题

    7.1 hermite递归函数 int hermite(int n, int x) { if (n <= 0) { return 1; } if (n == 1) { return 2 * x; ...

  7. C和指针 第六章 数组名与指针

    指针的算术运算符是指针和数组之间的一种关联,但不是唯一关联: 可以使用数组名作为指向数组第一个元素的指针,但是不可以给数组名赋新的值. //如下声明a int a[10]; //用a作为指向数组第一个 ...

  8. C和指针 第六章 指针6.2 6.3字符串中查找的两个版本

    int find_char(char **strings, char ch) { char *string; while ((string = *strings++) != NULL) { while ...

  9. C和指针 第五章 习题

    下列输出的值: #include <stdio.h> int func(){ static int count = 1; return ++count; } int main() { in ...

随机推荐

  1. css3属性-webkit-font-smoothing

    对字体进行抗锯齿渲染可以使字体看起来会更清晰舒服.在图标字体成为一种趋势的今天,抗锯齿渲染使用也越来越多. font-smoothing是非标准的CSS定义.它被列入标准规范的草案中,后由于某些原因从 ...

  2. win7中VS2010中安装CSS3.0问题解决方法

    win7中VS2010中安装CSS3.0问题解决方法   在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网 ...

  3. 通过xshell远程连接ubuntu

    ubuntu开启sshd服务SSH分客户端openssh-client和openssh-server如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果 ...

  4. 【.NET实战教程】北风网基于ASP.NET多层架构下的企业级进销存软件全程培训

    .Net进销存系统详细课程大纲(开发工具采用VS2008+sqlsever2005) [小编提醒:现在学习的话,可以使用vs2012+sql 2008 学习的是思路,教学环境不一定要一模一样]1.项目 ...

  5. caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片

    经过前面两篇博文的学习,我们已经训练好了一个caffemodel模型,并生成了一个deploy.prototxt文件,现在我们就利用这两个文件来对一个新的图片进行分类预测. 我们从mnist数据集的t ...

  6. 【原创】O2O,你真的知道怎么玩吗?

    自从2011年8月份,O2O的概念被Alex Rampell提出,并且在当年的11月份被引入中国以来,O2O这一概念就好像给久无新意的中国互联网行业,打了一针兴奋剂.O2O这个词也如麦当劳,星巴克这些 ...

  7. 一张图看懂git push

    基本用法 上面的四条命令在工作目录.暂存目录(也叫做索引)和仓库之间复制文件. git add files 把当前文件放入暂存区域. git commit 给暂存区域生成快照并提交. git rese ...

  8. MYSQL(一)

    一,概述: 1,什么是数据库: 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库. 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Serv ...

  9. MapReduce实现倒排索引(类似协同过滤)

    一.问题背景 倒排索引其实就是出现次数越多,那么权重越大,不过我国有凤巢....zf为啥不管,总局回应推广是不是广告有争议... eclipse里ctrl+t找接口或者抽象类的实现类,看看都有啥方法, ...

  10. Python【第一章】:简介和入门

    ython简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承.之 ...