C语言每日一题之No.9
再做决定之前,我还是做好自己该做的。我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦。尊敬的女王陛下,请接题:
一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出”abdefghjkmnptwy”。
二.思路:既然是已经排好序的,就用二分法查找的思想
将字符串s中的每个字符依次作为key拿来和字符串a做比较并且插入
三.程序
1 #include <stdio.h> 2 #include <string.h> 3 4 #define SIZE 50 5 6 void InsertStr(char *s,char *a,int low,int high) 7 { 8 int mid = 0; 9 10 while(*a) 11 { 12 mid = (low+high)/2; 13 14 //当mid位置字符<*a<mid+1位置字符或者mid位置字符等于*a时 15 if((s[mid]<*a) && (s[mid+1]>*a) || s[mid]==*a) 16 { 17 for(int j=mid+1;*(s+j);j++) 18 { 19 s[j] = *a;//把*a插入到字符串s中mid+1的位置 20 s[j+2]=s[j+1];//并且字符串s从mid+2开始的位置全部往后挪一个位置 21 high = high +1;//若每插入一个*a字符,则右区间要加1 22 } 23 } 24 else if(s[mid] >*a) 25 { //若mid位置对应的字符大于*a,则右区间变为mid 26 high = mid; 27 InsertStr(s,a,low,high); 28 } 29 else if(s[mid] <*a) 30 { //若mid位置对应的字符小于*a,则左区间变为mid 31 low = mid; 32 InsertStr(s,a,low,high); 33 34 } 35 36 a++; 37 } 38 39 40 } 41 42 43 int main(void) 44 { 45 char s[SIZE]={0}; 46 char a[SIZE]={0}; 47 48 printf("Please input the s string:\n"); 49 scanf("%s",s); 50 printf("Please input the a string:\n"); 51 scanf("%s",a); 52 53 InsertStr(s,a,0,strlen(s)); 54 printf("%s",s); 55 56 return 0; 57 58 }
三.编译运行
程序出错
四.分析问题
1.在插入字符串那个if条件语句里,犯了一个错误:往后面挪的时候,前面的已经把后面的覆盖了,比如a[6]=a[5],然后a[7]=a[6],看到没,这个时候a[6]已经被a[5]覆盖了,它再往后挪都不是自己原来的值了,所以要从最后面开始挪,这样才不会被覆盖。
2.*a可以肯定的是插在s[mid+1]的位置,所以直接s[mid+1]=*a;//把*a插入到字符串s中mid+1的位置就可以了,不然s[mid+1]的值会被*a覆盖
3.每插入一个字符都需要重新获取high
五.程序
1 #include <stdio.h> 2 #include <string.h> 3 4 #define SIZE 50 5 6 void InsertStr(char *s,char *a,int low,int high) 7 { 8 int mid = 0; 9 10 while(*a) 11 { 12 13 mid = (low+high)/2; 14 15 //当mid位置字符<*a<mid+1位置字符或者mid位置字符等于*a时 16 if((s[mid]<*a) && (s[mid+1]>*a) || s[mid]==*a) 17 { 18 for(int j=strlen(s)-1;j>=mid+1;j--) 19 { 20 s[j+1]=s[j];//并且字符串s从mid+2开始的位置全部往后挪一个位置 21 } 22 s[mid+1]=*a;//把*a插入到字符串s中mid+1的位置 23 24 } 25 else if(s[mid] >*a) 26 { //若mid位置对应的字符大于*a,则右区间变为mid 27 high = mid; 28 InsertStr(s,a,low,high); 29 } 30 else if(s[mid] <*a) 31 { //若mid位置对应的字符小于*a,则左区间变为mid 32 low = mid; 33 InsertStr(s,a,low,high); 34 35 } 36 37 a++; 38 high =strlen(s);//每个字符串a都要重新获取s字符串的长度 39 } 40 41 42 } 43 44 45 int main(void) 46 { 47 char s[SIZE]={0}; 48 char a[SIZE]={0}; 49 50 printf("Please input the s string:\n"); 51 scanf("%s",s); 52 printf("Please input the a string:\n"); 53 scanf("%s",a); 54 55 InsertStr(s,a,0,strlen(s)); 56 printf("%s",s); 57 58 return 0; 59 60 }
还是无法跳出InsertStr()函数,突然记起来要在函数末尾加一个return
1 a++; 2 high =strlen(s);//每个字符串a都要重新获取s字符串的长度 3 } 4 5 return; 6 }
真的可以跳出来了,但是却还是有问题,现在这样的运行结果是
六.到底哪里出了问题呢?
七.给出网上的解答版本
1 #include<stdio.h> 2 #include<string.h> 3 void main() 4 { 5 char a[20]="bdfhjmptwy"; //升序 6 char s[ ]="ganke"; 7 char *p1=a,*p2=s,*p=NULL; 8 while(*p2) 9 { 10 while(*p1) 11 { 12 if(*p2>*p1) p1++; 13 else break;//要有出口!!!! 14 } 15 p=p1;//保存指针的位置!!! 16 while(*p1) p1++; 17 while(p1!=p) 18 { 19 *(p1+1)=*p1; 20 p1--; 21 } 22 *(p1+1)=*p1; 23 *p=*p2; 24 p2++; 25 p1=a;//指针复原很重要!!!! 26 } 27 puts(a); 28 }
八.对比
那,鉴于你有这样的毅力,明天犒劳你一个又红又脆的苹果+一盒特仑苏纯牛奶哇~
转载于:https://www.cnblogs.com/TTTTT/p/3731240.html
C语言每日一题之No.9相关推荐
- 【C语言每日一题】——猜凶手
[C语言每日一题]--猜名次
- C语言每日一题:青蛙跳楼梯(学习笔记自用)
今天做了一道csdn上的题,即一个青蛙一次能跳1或2个梯子,请问他跳n阶梯子有多少种跳法?我当时一开始用的是数学排列组合里的分类计算法,先计算全部一个一个跳.又一次跳了两个.两次跳了两个...后来在看 ...
- C语言每日一题之No.12
文件操作知识:如何将一个文件的内容读取到另一个文件里? fread函数和fwrite函数 1.函数功能 用来读写一个数据块. 2.一般调用形式 fread(buffer,count,size, ...
- C语言每日一题——查找数字
在一组"有序"数组中查找某个数字,如果找到返回其下表,如果没有找到,输出"不存在". 一,遍历查找 就是将所有数都遍历一遍 找是否存在该数字如果存在返回下标 具 ...
- C语言每日一题——数字金字塔
如果有同学问你,"你会用代码打印出,数字金字塔吗?" 如果你阅读了这篇文章你将,会十分自信的去告诉他,这都小意思. //数子金字塔 //1//01(0代表空格 方便演示) //12 ...
- 【C语言每日一题】验证尼科彻斯定理
✨✨ 题目:验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和. 例如: 1^3=1 2^3=3+5 3^3=7+9+11 4^3=13+15+17+19 输入一个正整数m(m≤10 ...
- C语言每日一题——求年龄(周岁)
你真的了解你自己吗 你知道你现在几岁了吗 你能准确说出来吗 我看你不怎么知道那我就用代码来告诉你 你究竟多岁? 代码演示: 请小伙伴自由评论,加油铁汁~
- C语言每日一题-PTA基础编程题-7-28 猴子选大王
7-28 猴子选大王 (20分) 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻 ...
- 【C语言蓝桥杯每日一题】—— 单词分析
[C语言蓝桥杯每日一题]-- 单词分析
最新文章
- 在html中引用css样式表,怎么引用css样式?
- dr. unarchiver_P160 四季可穿,数仙女尽折腰!醉高版本Dr马丁靴女2020秋冬新款牛筋底1460英伦风8孔系带复古机车军靴真皮短靴马丁靴...
- 【NLP】一文搞懂NLP中的对抗训练
- mysql的基本数据类型_mysql基本数据类型(mysql学习笔记三)
- php 验证码一直不对,ThinkPHP验证码老是出错怎么办
- C语言之原码、反码和补码
- python的reduce()函数
- 【转】SpringMVC整合websocket实现消息推送及触发
- python物理模拟.pdf_用Python物理建模的第一本书终于来啦
- 计算机监控系统英文缩写,各弱电系统英文缩写
- 骑士人才linux伪静态,骑士CMS人才系统伪静态的设置方法
- The OCD Brain: how animal research helps us understand a devastating condition
- 聪明的人脸识别4——Pytorch 利用Retinaface+Facenet搭建人脸识别平台
- 夺冠之夜,荣耀的坚守和变通
- linux mac地址远程开机,用MAC地址远程开机的开机棒你见过吗?
- 大数据开发,真的这么香吗?
- 学习Vue3 第五章(Vue核心虚拟Dom和 diff 算法)
- 光耦隔离前后电阻阻值选择注意事项
- 17岁高中生证明著名数学难题,因此被MIT录取
- 人机大战引关注 人工智能概念股有望受追捧
热门文章
- JZOJ 5924. 【NOIP2018模拟10.23】Queue
- JZOJ 5068. 【GDSOI2017第二轮模拟】树
- mysql试题百度云_BATJ大厂600多道技术面试题及答案解析
- 设备树与驱动的关系_Linux CommonClock Framework分析之四 gpio clk gate驱动实现
- 程序异常是python语言基本控制结构_计算机二级python 知识点篇(程序的控制结构)...
- LPS25HB 气压计 参考手册中关于FIFO功能的解读
- ACM竞赛学习整理开篇之01背包问题
- map怎么转化dto_java实现Object和Map之间的转换3种方式
- tomcat 外网访问不了_免费云服务器/jdk环境配置/Tomcat简单配置
- php.ini文件可以复制吗,php安装完成以后要复制php.ini文件