0%

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
void f(int n)
{
    char c;
    if (n==1) {
        c = getchar();
        putchar(c);
    }else
    {
        c = getchar();
        f(n-1);
        putchar(c);
    }
}
int main() {
    void f(int n);
    f(10);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int factorial(int input)
{
    if (input==1) {
        return 1;
    } else {
        return input*factorial(input-1);
    }
}
int main() {
    printf("%d",factorial(5));
    return 0;
}

题目:求1!+2!+3!+…+20!的和

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
#include <stdio.h>
unsigned long long Factorial(int input)
{
    if (input>0)
    {
        return input*Factorial(input-1);
    }
    else
        return 1;
}

unsigned long long Factorial_Sum(int max)
{
    if (max>0)
    {
        return Factorial(max)+Factorial_Sum(max-1);
    }
    else
    {
        return 0;
    }
}

int main()
{
    int max = 20;
    unsigned long long ret = Factorial_Sum(max);
    printf("%.0llu",ret);
    return 0;
}

题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
程序分析:请抓住分子与分母的变化规律。

递归解决:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
float Cal(float a,float b,int count)
{
    if (count<=0)
    {
        return 0;
    }else
    {
        float temp = b/a;
        float c = a + b;
        return (temp + Cal(b, c, count-1));
    }
}
int main(
{
    float a = 1;
    float b = 2;
    int count = 20;
    float ret = Cal(a,b,count);
    printf("%lf",ret);
    return 0;
}

题目:打印出菱形图案
效果:

1
2
3
4
5
6
7
   *
  ***
 *****
*******
 *****
  ***
   *
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
#include <stdio.h>
#define MAX 4 //定义要打印的行数
int main()
{
    int row = 1;//行
    for (row=1; row<=MAX; row++)//打印上半部分
    {
        int col = 2*row-1;//上半部分每行打印的星号个数
        int spcae = MAX - row;//上半部分的空格数是定义的最大行数-现在行数
        int i;//打印空格
        int j;//打印*号
        for (i=0; i<spcae; i++)//打印空格
        {
            printf(" ");
        }
        for (j=0; j<col; j++)//打印星号
        {
            printf("*");
        }
        printf("\n");
    }
    for (row=1; row<MAX; row++)//打印下半部分
    {
        int col = 2*MAX-(2*row+1);//下半部分每行打印的星号个数
        int spcae = row;//下半部分的空格数和行数是相等的
        int i;//打印空格
        int j;//打印*号
        for (i=0; i<spcae; i++)//打印空格
        {
            printf(" ");
        }
        for (j=0; j<col; j++)//打印星号
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

猴子吃桃问题:

  • 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

递归解决:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int Cal_Peach(int day,int Left_Peach)
{
    if (day==1) {
        return (Left_Peach + 1) * 2;
    } else {
        int temp = (Left_Peach+1)*2;
        return Cal_Peach(--day, temp);
    }
}
int main()
{
    int day = 9;
    int Left_Peach = 1;
    int Peach = Cal_Peach(day,Left_Peach);
    printf("%d\n",Peach);
    return 0;
}

for循环解决:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main()
{
    int day;
    int x = 1;
    int y = 0;
    for (day=9; day>=1; day--)
    {
        y = ( x + 1 ) * 2;
        x = y;
    }
    printf("%d\n",y);
    return 0;
}

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main() {
    float height = 100;
    int count = 0;
    float distance = 0;
    for (count=1; count<=10; count++)
    {
        distance = height + distance;
        height = height / 2;
        printf("第%d次落地,下次高度:%lf,总距离:%lf\n",count,height,distance);
    }
    return 0;
}

题目:一个数如果恰好等于它的因子之和,这个数就称为“完数“。
例如:6=1+2+3.编程找出1000以内的所有完数。

如何找到一个数的所有因子?

  • 先来一个从1到小于这个数的循环,如果这个数字%循环次数等于0,那么这个数字就是这个数字的一个因数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main()
{
    int Num;
    for (Num=1; Num<=1000; Num++)
    {
        int j;
        int sum=0;
        for (j=1; j<Num; j++)
        {
            if (Num%j==0)
            {
                sum = sum + j;
            }
        }
        if (sum == Num) {
            printf("%d ",Num);
        }
    }
    return 0;
}

题目:求S=a+aa+aaa+aaaa+a…a的值,a是数字。
例如2+22+222+2222+22222(此时共有5个数相加),几个数相加和相加的数字由键盘输入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <math.h>
int main()
{
    int a,b,sum=0;
    int i;
    int temp=0,temp2;
    printf("请输入这个数字:->");
    scanf("%d",&a);
    printf("请输入几位数字相加:->");
    scanf("%d",&b);
    for (i=0; i<b; i++)
    {
        temp = pow(10,i) + temp;
        a = 2*temp;
        sum = sum + a;
    }
    printf("%d\n",sum);
    return 0;
}

相关:pow语法

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

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
#include <stdio.h>
int main() {
    int Letter = 0;
    int Num = 0;
    int Space = 0;
    int Others = 0;
    char c;
    c = getchar();
    while (c!='\n') {
        if ((c>=65 && c<=90) || (c>=97 && c<=122))//这个字符是英文字符
        {
            Letter++;
        }else if(c>=48 && c<=57)//这个字符是数字
        {
            Num++;
        }else if (c == ' ')
        {
            Space++;
        }else
        {
            Others++;
        }
        c = getchar();
    }
    printf("Letter = %d \nNumber = %d \nSpace = %d \nOthers = %d \n",Letter,Num,Space,Others);
    return 0;
}

总结:

  • 想要判断一个字符,本质上是判断这个字符的ASCII码,可以直接拿这个字符和ASCII码比较,不用加单引号,但想拿它和另一个字符比较,另一个字符必须加单引号。(可能是字符加了单引号就转换成了ASCII码?)
  • &&一个条件为假,结果为假
  • ||一个条件为真,结果为真
    参考:逻辑操作符