No.21 -No.25 C语言从入门到竞赛精通

| No.21: 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。

题目分析

本题就题面而言,其规律还是蛮明显的:自第二项起,前一项的 分子 为当前项的 分母 ,当前项的 分子 为前一项的 分子分母之和 ,在总结出这个规律之后,其实我们已经可以开始写代码了,还有一点需要捎带提一嘴的,有读者私信提到,C语言的除法运算后的结果其数据类型不会判断,其实在C语言中,除法最终的结果是何种数值类型取决于分子和分母数据类型是否相同,且浮点型优先于整型,即分子分母中如果存在有浮点型数据,则最终的运算结果也会是浮点型。

在整理完上述思路之后,我们来看代码:

#include<stdio.h>

int main(){
    int nums = 20;
    float fenzi = 2;
    float fenmu = 1;
    float sum = 0;
    printf("%.f/%.f ", fenzi, fenmu); // 使用%.f用于美化输出结果
    for (int i=1; i<=nums; i++){
        printf("+ ");
        sum += fenzi/fenmu;
        int tmp = fenzi;
        fenzi = fenmu + fenzi;
        fenmu = tmp;
        printf("%.f/%.f ", fenzi, fenmu);
    }
    printf("= ");
    printf("%f", sum);
}

最终运行结果如下:

| No.22: 题目:求1+2!+3!+…+20!的和

题目分析

本题为前面提到的递归求一个数的阶乘的变体,但是其难度提升不大,无非就是多了一个循环求和而已,另外,还有一个需要注意的点就是:各个数据类型其对应有不同的数据范围,一般对于这种可能会设计大数的,我还是比较推荐直接使用float或者double类型的数据类型,本体比较简单,我们直接来看代码:

#include<stdio.h> 

float getsum(int num){
    if (num == 1) return 1;
    else return num*getsum(num-1); // 递归求乘积
}

int main(){
    float sum = 0;
    int num;
    scanf("%d", &num);

    for (int i=1; i<=num; i++)
        sum += getsum(i); // 循环求范围内的数值阶乘之和

    printf("sum: %e", sum);
}

最终运行效果如下:

| No.23: 题目:利用递归方法求5!

题目分析

本题需求为求一个数的阶乘,算是No.22题的简化版,此类题目为递归类型题目的入门题,关键在于递归体的逻辑书写,此前也有比较多的递归类型题目,有需求的读者可以选择查看以前的文章,在本题处不再叙述关于递归的基础知识,由于本题比较简单,我们直接来看代码:

#include<stdio.h> 

int getsum(int num){
    if (num == 1) return 1; // 递归出口
    else return num*getsum(num-1); // 递归求阶乘
}

int main(){
    int num;
    printf("请输入您想求得的阶乘数\n");
    scanf("%d", &num);
    int res = getsum(num);
    printf("%d!的值为:%d", num, res);

}

最终执行结果为:

| No.24: 题目:利用递归函数调用方式,将所输入的字符,以相反顺序打印出来。

题目分析

本题的需求为使用递归法逆序打印输入的字符,属于递归类型题目中偏中等难度的题目,由于C语言的特性,我们无法直接对字符串进行操作,因此我们需要先将输入的字符串进行存储,将其存储在一个char类型的字符数组之中,此后,我们需要将递归的重心从字符转移到字符索引中来。

经过上述分析之后,小伙伴们应该也能联想到,本题解题的关键就是递归的对象,在本题中,显然这个关键对象就是字符索引。

在有了上述思路之后,我们来看代码:

 #include<stdio.h>

 void show_(char str[], int len){
     printf("%c", str[len]);
    if (len == 0) return ; // 已经逆序输出完了,递归出口
    return show_(str, len-1); // 递归,依靠index逐渐递减以实现逆序
 }

 int main(){
     char str[1001];
     int i=0;
    while(1){
        char tmp = getchar();
         if (tmp == '\n' || tmp == EOF) break;
         str[i] = tmp;
         i ++;
    }
    show_(str, i-1);
 }

最终执行效果为:

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

题目分析

本题与No.23难度相当,都是属于递归类型的入门题型,由于本题逻辑比较清晰,难度较为简单,我们直接来看代码:

#include<stdio.h>

int get_age(int person){
    if (person == 1) return 10;
    return get_age(person-1)+2;
}

int main(){
    printf("第五个人 %d 岁", get_age(5));
}

最终运行结果:

那么以上就是本期 C语言从初识到竞赛精通 No.21-No.25 的全部内容了,如果您在阅读本文的过程中有所收获,或者有任何宝贵的建议和想法,欢迎通过邮箱、微信或者留言等方式给我留言交流,您的每一次建议都将是我前进的动力!

上一篇