C语言--吉大oj期末相关的一些题的思路以及实现

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中的元素个数,不能定义额外的新数组。

这道题中的考察点主要是“严格增序”,非严格增序可以存在相同元素,严格增序则不能,也就是说在合并之后需要去重(或者直接在合并过程中检测到重复的就删除,毕竟在原数组中不会出现重复)

 

你可能感兴趣的:(c语言)