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<n;i++){       if(sum==a[i])return true;       else sum+=a[i];   }   return false;}int main (){    int n;    scanf("%d",&n);    int a[n];    int i;    for(i=0;i<n;i++)scanf("%d",&a[i]);    if(f(a,n)==false)printf("no");    else printf("yes");    return 0;}

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

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

 

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值