• C语言:练习题三


    一、递归求和

    题目描述

    利用递归方法求5!。

    题目分析

    递归公式:fn=fn_1*4!

    代码

    #include<stdio.h>
    int main()
    {
        int i;
        int fact(int);
        for(i=0;i<6;i++){
            printf("%d!=%d\n",i,fact(i));
        }
    }
    int fact(int j)
    {
        int sum;
        if(j==0){
            sum=1;
        } else {
            sum=j*fact(j-1);
        }
        return sum;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    效果
    在这里插入图片描述

    二、逆序递归

    题目描述

    逆序递归

    题目分析

    利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

    源码

    #include <stdio.h>
     
    int main()
    {
        int i=5;
        void palin(int n);
        printf("请输入5个字符\40:\40");
        palin(i);
        printf("\n");
    }
    void palin(n)
    int n;
    {
        char next;
        if(n<=1) {
            next=getchar();
            printf("相反顺序输出结果\40:\40");
            putchar(next);
        } else {
            next=getchar();
            palin(n-1);
            putchar(next);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    效果
    在这里插入图片描述

    三、猜年龄

    题目描述

    有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,
    他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。 最后问第一个人,他说是10岁。请问第五个人多大?

    题目分析

    利用递归的方法,递归分为回推和递推两个阶段。 要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推

    源码

    #include <stdio.h>
     
    int age(n)
    int n;
    {
        int c;
        if(n==1) c=10;
        else c=age(n-1)+2;
        return(c);
    }
    int main()
    {
        printf("%d\n",age(5));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    效果
    在这里插入图片描述

    四、逆序

    题目描述

    给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

    题目分析

    学会分解出每一位数

    源码

    #include <stdio.h>
     
    int main( )
    {
        long a,b,c,d,e,x;
        printf("请输入 5 位数字:");
        scanf("%ld",&x);
        a=x/10000;        /*分解出万位*/
        b=x%10000/1000;   /*分解出千位*/
        c=x%1000/100;     /*分解出百位*/
        d=x%100/10;       /*分解出十位*/
        e=x%10;           /*分解出个位*/
        if (a!=0){
            printf("为 5 位数,逆序为: %ld %ld %ld %ld %ld\n",e,d,c,b,a);
        } else if(b!=0) {
             printf("为 4 位数,逆序为: %ld %ld %ld %ld\n",e,d,c,b);
        } else if(c!=0) {
             printf("为 3 位数,逆序为:%ld %ld %ld\n",e,d,c);
        } else if(d!=0) {
             printf("为 2 位数,逆序为: %ld %ld\n",e,d);
        } else if(e!=0) {
             printf("为 1 位数,逆序为:%ld\n",e);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    效果
    在这里插入图片描述

    五、回文数

    题目描述

    一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

    题目分析

    学会分析每一位数。

    源码

    #include <stdio.h>
     
    int main( )
    {
        long ge,shi,qian,wan,x;
        printf("请输入 5 位数字:");
        scanf("%ld",&x);
        wan=x/10000;        /*分解出万位*/
        qian=x%10000/1000;  /*分解出千位*/
        shi=x%100/10;       /*分解出十位*/
        ge=x%10;            /*分解出个位*/
        if (ge==wan&&shi==qian) { /*个位等于万位并且十位等于千位*/
            printf("这是回文数\n");
        } else {
            printf("这不是回文数\n");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    效果

    在这里插入图片描述

    六、查询日期

    题目描述

    请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

    题目分析

    用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。

    源码

    #include<stdio.h>
     
    int main()
    {
        char i,j;
        printf("请输入第一个字母:\n");
        scanf("%c",&i);
        getchar();//scanf("%c",&j);的问题,第二次是读入的一个换行符,而不是输入的字符,因此需要加一个getchar() 吃掉换行符
        switch(i)
        {
            case 'm':
                printf("monday\n");
                break;
            case 'w':
                printf("wednesday\n");
                break;
            case 'f':
                printf("friday\n");
                break;
            case 't':
                printf("请输入下一个字母\n");
                scanf("%c",&j);
                if (j=='u') {printf("tuesday\n");break;}
                if (j=='h') {printf("thursday\n");break;}
            case 's':
                printf("请输入下一个字母\n");
                scanf("%c",&j);
                if (j=='a') {printf("saturday\n");break;}
                if (j=='u') {printf("sunday\n"); break;}
            default :
                printf("error\n"); break;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    效果
    在这里插入图片描述

    七、删除指定字母

    题目描述

    删除一个字符串中的指定字母,如:字符串 “aca”,删除其中的 a 字母。

    题目分析

    循环遍历,对照删除。

    源码

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    // 删除字符串中指定字母函数
    char* deleteCharacters(char * str, char * charSet)
    {
        int hash [256];
        if(NULL == charSet)
            return str;
        for(int i = 0; i < 256; i++)
            hash[i] = 0;
        for(int i = 0; i < strlen(charSet); i++)
            hash[charSet[i]] = 1;
        int currentIndex = 0;
        for(int i = 0; i < strlen(str); i++)
        {
            if(!hash[str[i]])
                str[currentIndex++] = str[i];
        }
        str[currentIndex] = '\0';
        return str;
    }
     
    int main()
    {
        char s[2] = "a";     // 要删除的字母
        char s2[5] = "aca";  // 目标字符串
        printf("%s\n", deleteCharacters(s2, s));
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    效果
    在这里插入图片描述

    八、判断质数

    题目描述

    判断一个数字是否为质数。

    题目分析

    质数(prime number)又称素数,有无限个。 一个大于1的自然数,除了1和它本身外,不能被其他自然数整除

    源码

    #include<stdio.h>
    #include<math.h>
    #define MAX 1000
     
     
    int prime[MAX];
     
    int isPrimeNaive(int n)
    {
        if(n <= 1)
            return 0;
        for(int i = 2; i < n; i++)
            if(n % i == 0)
                return 0;
        return 1;
    }
     
    int isPrime(int n)
    {
        if(n<= 1)
            return 0;
        if(n == 2)
            return 1;
        if(n%2 == 0)
            return 0;
        int limit = (int)sqrt((double)n);
        for(int i = 3; i <= limit; i=i+2)
        {
            if(n % i == 0)
                return 0;
        }
        return 1;
    }
     
    void sieve()
    {
        prime[0] = 0;
        prime[1] = 0;
        for(int i = 2; i < MAX; i++)
            prime[i] = 1;
        int limit = (int)sqrt((double)MAX);
        for(int i = 2; i <= limit; i++)
        {
            if(prime[i])
                for(int j = i*i; j <= MAX; j+=i)
                    prime[j] = 0;
        }
    }
     
    int isPrimeSieve(int n)
    {
        if(prime[n])
            return 1;
        else
            return 0;
    }
     
    int main()
    {
        sieve();
        printf("N=%d %d\n", 1, isPrime(1));
        printf("N=%d %d\n", 2, isPrime(2));
        printf("N=%d %d\n", 3, isPrime(3));
        printf("N=%d %d\n", 4, isPrime(4));
        printf("N=%d %d\n", 7, isPrime(7));
        printf("N=%d %d\n", 9, isPrime(9));
        printf("N=%d %d\n", 13, isPrime(13));
        printf("N=%d %d\n", 17, isPrime(17));
        printf("N=%d %d\n", 100, isPrime(100));
        printf("N=%d %d\n", 23, isPrime(23));
        printf("N=%d %d\n", 1, isPrime(1));
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    效果
    在这里插入图片描述

    九、函数调用

    题目描述

    练习函数调用。

    题目分析

    练习函数调用。

    源码

    #include <stdio.h>
    void hello_world(void)
    {
        printf("Hello, world!\n");
    }
    void three_hellos(void)
    {
        int counter;
        for (counter = 1; counter <= 3; counter++)
            hello_world();/*调用此函数*/
    }
    int main(void)
    {
        three_hellos();/*调用此函数*/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    效果
    在这里插入图片描述

    十、字符反转

    题目描述

    字符串反转,如将字符串 “www.abcd.com” 反转为 “moc.dcba.www”。

    题目分析

    源码

    #include <stdio.h>
     
     
    void reverse(char* s)
    {
        // 获取字符串长度
        int len = 0;
        char* p = s;
        while (*p != 0)
        {
            len++;
            p++;
        }
        
        // 交换 ...
        int i = 0;
        char c;
        while (i <= len / 2 - 1)
        {
            c = *(s + i);
            *(s + i) = *(s + len - 1 - i);
            *(s + len - 1 - i) = c;
            i++;
        }
    }
     
    int main()
    {
        char s[] = "www.abcd.com";
        printf("'%s' =>\n", s);
        reverse(s);           // 反转字符串
        printf("'%s'\n", s);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    效果
    在这里插入图片描述

  • 相关阅读:
    redis的四种模式
    Java中JavaBean对象和Map的互相转换
    超硬核的Move Dev Meetup上海线下交流会圆满结束
    如何提高网站安全防护?
    工具使用:vue2使用 swiper5
    计算机网络【CN】子网划分与子网掩码
    设计模式之门面模式
    怎么用JMeter写性能测试脚本
    POJ 2836 Rectangular Covering 状态压缩DP(铺砖问题)
    c# iot .net 6 树莓派 读取光敏传感器四针+模拟转数字模块 代码实例
  • 原文地址:https://blog.csdn.net/qq_45801904/article/details/125515467