C语言必会100题(6)。利用递归方法求5!/利用递归函数调用方式,反向打印字符/五个人问岁数/输入一个不多于5位数的整数,判断是几位数/输入一个5位数,判断它是不是回文数

特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬)
题目来源:https://fishc.com.cn
注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了可读性),部分是本人经过深思熟虑后编写的。

26,利用递归方法求5!

1.题目:利用递归方法求5!。
2.提示:采用函数形式,在函数里面可以递归,调用自己。
3.程序源代码:

#include <stdio.h>

int fact(int j);

int main()
{
    int i;

    for(i = 1; i < 6; i++)
        printf("%d! = %d\n", i, fact(i));
    return 0;
}

int fact(int j)
{
    int sum;
    if(j == 0)
        sum = 1;
    else 
        sum = j * fact(j - 1);
    return sum;
}

27,利用递归函数调用方式,反向打印字符

1.题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
2.程序源代码:

#include <stdio.h>

void palin(int n);

int main()
{
    int i = 5;

    printf("\40:"); // \40在屏幕上显示空格,转义字符八进制,转为十进制为32,ASCII码表中表示空格
    palin(i);
    printf("\n");
    return 0;
}

void palin(int n)
{
    char next;
    if(n <= 1)
    {
        next = getchar(); // 读取字符
        printf("\n:");
        putchar(next); // 输出字符
    }
    else
    {
        next = getchar();
        palin(n - 1);
        putchar(next);
    }
}

28,五个人问岁数

1.题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后 问第一个人,他说是10岁。请问第五个人多大?
2.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
3.程序源代码:

#include <stdio.h>

int age(int n);

int main()
{
    printf("%d\n", age(5));
    return 0;
}

int age(int n)
{
    int c;

    if(n == 1) {
        c = 10;
    } else {
        c = age(n - 1) + 2;
    }

    return c;
}

29,输入一个不多于5位数的整数,判断是几位数

1.题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
2.程序源代码:

  1. 第一种解:
#include <stdio.h>

void reversal();

int main()
{
    int count = 0;
    int a[10];
    int n;
    int i = -1;

    printf("请在屏幕上输入不多于5位的数字:\n");

    // 使用getchar()函数会有bug,但是我是一个初学者,所以凑合着用吧
    // getchar()函数只接收字符,会将其转化为ASCII码值
    while ( (n = getchar()) != '\n' ) {
        i++;
        a[i] = n;
        count++;
    }

    printf("总共有%d位数\n", count);
    printf("颠倒后的数字为:");
    for (int j = count; j >= 0; j--) {

        putchar(a[j]);
        // 不能这么做。
        // printf("%d\n", a[j]);
    }

    return 0;
}
  1. 第二种解:
// 这个用的是递归,但是我不会计数器来判断用户输入的数字个数
// 有大佬路过的话,麻烦帮忙看一下
#include <stdio.h>

void reversal();

int main()
{
    int i = 5;

    printf("请在屏幕上输入不多于5位的数字:\n");

    reversal(i);

    return 0;
}


void reversal(int n) {

    int next;

    if(n <= 1)
    {
        next = getchar(); // 读取字符
        putchar(next); // 输出字符
    }
    else
    {
        next = getchar();
        reversal(n - 1);
        putchar(next);
    }
}
  1. 第三种解:
#include <stdio.h>

int main( )
{
    long a, b, c, d, e, x;

    printf("请输入不多于5位的数字:\n");
    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("there are 5, %ld %ld %ld %ld %ld\n",e,d,c,b,a);
    } else if (b!=0) {
        printf("there are 4, %ld %ld %ld %ld\n",e,d,c,b);
    } else if (c!=0) {
        printf(" there are 3,%ld %ld %ld\n",e,d,c);
    } else if (d!=0) {
        printf("there are 2, %ld %ld\n",e,d);
    } else if (e!=0) {
        printf(" there are 1,%ld\n",e);
    }

    return 0;
}

30,输入一个5位数,判断它是不是回文数

1.题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
2.程序源代码:

  1. 第一种解:
#include <stdio.h>

int main() {

    int a;
    int array[5];
    int num = -1;

    printf("请输入一个5位数:");

    while ( (a = getchar()) != '\n') {
        num++;
        array[num] = a;
    }

    if (array[0] == array[4] && array[1] == array[3]) {
        printf("这是一个回文数!");
    } else {
        printf("这不是一个回文数!");
    }
    
    return 0;
}

  1. 第二种解:
#include <stdio.h>

int main( )
{
    // 个位数:units
    // 十位数:tens
    // 千位数:thousands
    // 万位数:ten_thousand
    long units, tens, thousands, ten_thousand, x;

    printf("请输入一个5位数:");
    scanf("%ld", &x);

    ten_thousand = x / 10000;
    thousands = x % 10000 / 1000;
    tens = x % 100 / 10;
    units = x % 10;

    // 个位等于万位并且十位等于千位
    if(units == ten_thousand && tens == thousands) {
        printf("this number is a huiwen\n");
    } else {
        printf("this number is not a huiwen\n");
    }

    return 0;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值