1.寻找一个字符串是否含有子字符串
#include "stdbool.h"bool flag;int f(char *s1,char *s2){ char *p,*q; for(;*s1!='';s1++){ if(*s2==*s1){ flag=1; p=s1;//p为第一个相同字符的地址 q=s2; for(;*q!='';){ if(*q++!=*p++){ flag=0; break; } } }
通过flag判断是否含有子串(定义一个int型变量在循环内判断内外赋值也一样好用)
2.不用任何string.h内包含的内容实现两个字符串的长度差值
c思路:对字符串以结尾的考察
分别从头到尾遍历并计数
记得判断条件是哦
#include "stdio.h"int f(char *str){ int i,j=0; for(i=0;*(str+i)!='';i++)j++; return j;}int main(){ char str1[]="abc"; char str2[]="abcde"; int i=f(str1); int j=f(str2); int k; if(i>=j)k=i-j; else k=j-i; printf("%d",k); return 0;}
3.木头折断问题(用递归实现)
一个长度为n(double类型变量,n > 5)的木条,
可以在其2 / 5处折断,变为两段长度分别为2n / 5、3n / 5的木条;如果得到的木条的长度仍大于5,则继续按照上述方法折断,直到任意木条的长度均不大于5为止。编写递归函数,计算一个长度为n的木条,最后会被折断为多少根木条
#include "stdio.h"int count=1;int f(double n){ if(n<5)return count; else{ count++; f(2*n/5); f(3*n/5); return count; }}int main(){ double n; scanf("%lf",&n); printf("%d",f(n)); return 0;}
多想想不就会了吗
4.编写函数,实现按照如下公式计算的功能:
f(n)=0/(12!)+1/(23!)+2/(34!)+……+n/((n+1)(n+2)!),其中n为自然数
#include "stdio.h"int mult(int n){ if(n==1)return 1; else return n*mult(n-1);}float f(int n){ int i; float j=0; for(i=0;i<=n;i++){//妈的注意判断条件======================= j+=i/(float)((i+1)*mult(i+2)); } return j;}int main(){ int n; scanf("%d",&n); printf("%f",f(n)); return 0;}
5.编写一个递归函数,计算组成给定正整数n的所有数字之和
#include "stdio.h"int f(int n){ if(n/10==0)return n; else return n+f(n/10);//直到处理到最后一位}int main (){ int n; scanf("%d",&n); printf("%d",f(n)); return 0;}
6.编写bool函数,判断给定的整数数组a[n]中是否存在元素a[i],i的取值范围为0到n,等于其前边所有元素之和,即a[i]=a[0]+a[1]+a[2]+a[3]+…a[i-1]
#include "stdio.h"#include "stdbool.h"bool f(int a[],int n){ int sum=0; int i; for(i=0;i
7.写一个结构体存放教师的个人信息
#include "stdio.h"struct teacher{//结构体类型标签 char name[20]; int sex; int age;};int main() { int n; scanf("%d", &n); struct teacher info[20];//这个类型的数组,每个元素对应一个完整结构体 struct teacher *p = info; for (int i = 0; i < n; i++) { scanf("%s %d %d", (p + i)->name, &(p + i)->sex, &(p + i)->age); } for (int i = 0; i < n; i++) { printf("%s%d%d", (p + i)->name, (p + i)->sex, (p + i)->age); } return 0;}
当结构体内类型为数组并且通过指针访问结构体元素时,不需要再取指针所指变量值
8.十进制数转二进制(任意进制,思路相同)
#include "stdio.h"void change(int x){//只是printf数组没有返回值必须用void类型 int a[100]; int i=0; while(x!=0){//由于几位数未知用一个while循环x/n!=0判断是否入循环 a[i++]=x%2;//用i++结合i=0的初值 x=x/2; } for(int j=i-1;j>=0;j--)printf("%d",a[j]);//循环内加printf}int main(){ int x; scanf("%d",&x); change(x); return 0;}
9.编写函数 int mergearr (int a[], int m, int b[], int n),将两个严格增序数组a和b合并后存储在a中,并保证处理后的数组仍然严格增序,函数值返回合并后数组a中的元素个数,不能定义额外的新数组。
这道题中的考察点主要是“严格增序”,非严格增序可以存在相同元素,严格增序则不能,也就是说在合并之后需要去重(或者直接在合并过程中检测到重复的就删除,毕竟在原数组中不会出现重复)