19_1_C语言基础_Lab07_Recursion and Function

1.正整数的各位数字之和

请编写递归程序,计算给定正整数的各位数字之和。例如,如果实参为12345,则函数返回1+2+3+4+5=15,即返回15.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,x=0;
    scanf("%d",&n);
    while(n!=0)
    {
        x=x+n%10;
        n/=10;
    }
    printf("%d",x);
    return 0;
}

2.逆序输出

请编写递归函数,该函数每次调用时将会让用户输入一个正整数,如果输入0或者负数时程序结束。函数将按照逆序输出整数值。
例如用户输入 10 20 30 0 程序输出 30 20 10

#include <stdio.h>
#include <stdlib.h>

int pri(int n)
{
    int m;
    if(n==0)
        return;
    else{
        scanf("%d",&m);
        pri(m);
        printf("%d ",n);
    }
}


int main()
{
    int n;
    scanf("%d",&n);
    pri(n);
    return 0;
}

3.十进制转二进制

编写递归程序将十进制整数n转换成二进制数,要求从高位到低位输出二进制数的结果。

#include <stdio.h>
#include <stdlib.h>

long long trans(int x)
{
    int remain;
    if(x==0)
        return 0;
    else
    {
        remain=x%2;
        x/=2;
        trans(x);
        printf("%d",remain);
    }
}


int main()
{
    int num;
    scanf("%d",&num);
    //char num2[32];
    //printf("%s", itoa(num, num2, 2));
    trans(num);
    return 0;
}

4.最大公约数

请编写递归程序求解两个数的最大公约数;int GDB(int a, int b)
GDB(a.b) = a if b =0
GDB(a.b)=GDB(b, a%b), if b >0

#include <stdio.h>
#include <stdlib.h>

int gys(int a,int b)
{
    if(b==0)
    {
        return a;
    }
    return gys(b,a%b);
}

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("%d",gys(a,b));
    return 0;
}

5.fibonacci函数

请用递归的形式实现fibonacci函数.
int fibonacci(int n)
/* fibonacci: recursive version
Pre: The parameter n is a nonnegative integer.
Post: The function returns the nth Fibonacci number.

#include <stdio.h>
#include <stdlib.h>

unsigned int fibo(int n)
{
    if ((n==1)||(n==2))
        return 1;
    else if(n==0)
        return 0;
    else
        return fibo(n-1)+fibo(n-2);
}

int main()
{
    int n;
    scanf("%d",&n);
    printf("%u",fibo(n));
    return 0;
}

6.*号构成的菱形图案

(循环)
输入一个正整数repeat (0<repeat<10),做repeat次下列操作:
输入一个正整数n,打印一个边长为 n 的菱形图案,注意,每一行最后一个后面要求输出一个空格!
输出使用以下语句:
printf(" “);
printf(”
“);
printf(”\n");
输入输出示例:括号内为说明
输入
2 (repeat=2)
3 (n=3)
4 (n=4)
输出
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int lingxing(int n)
{
    int i,j,m,t;
    for(i=0;i<n;i++)
    {
        for(j=1;j<=2*n-1;j++)
        {
            if((j<=n+i)&&(j>=n-i))
            {
                printf("* ");
            }
            else printf("  ");
        }
        printf("\n");
    }
    for(m=n-2;m>=0;m--)
    {
        for(t=1;t<=2*n-1;t++)
        {
            if((t<=n+m)&&(t>=n-m))
            {
                printf("* ");
            }
            else printf("  ");
        }
        printf("\n");
    }

}
int main()
{
    int m,repeat;
    scanf("%d ",&repeat);

    while(scanf("%d ",&m)!=EOF)
    {
        lingxing(m);
    }

    return 0;
}

7.函数调用中的平均值

(函数)Write a value-returning float function called RunningAvg that takes a float variable, value, as its input and returns the running average of all the values that have been passed to the function since the program first call it. For example RunningAvg(10); //return 10 RunningAvg(20);//return 15 RunningAvg(30);//return 20
输入为-1时结束。每行输出对应每行输入,输出保留2位小数。
样例输入:
10
20
30
-1
样例输出:
10.00
15.00
20.00

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float n=0;
    float x,cnt=1;
    float ans=0;
    scanf("%f",&x);
    while(x!=-1)
    {
        n=n+x;
        ans=n/cnt;
        printf("%.2f\n",ans);
        cnt++;
        scanf("%f",&x);
    }
    return 0;
}

8.日期间相隔的天数

用户输入包含年,月,日的日期,请计算两个日期间相隔的天数;
样例输入1:
2015 10 30 2016 4 15
样例输出1:
采集时间为168天
样例输入2:
2011 6 1 2016 11 10
样例输出:
采集时间为1989天

#include <stdio.h>
#include <stdlib.h>

int runyear(int year)
{
    int peryear;
    if((year%4==0&&year%100!=0)||(year%400==0))
        peryear = 366;
    else peryear = 365;
    return peryear;
}

int month(int year,int month)
{
    int permon;
    if((runyear(year)==366)&&(month==2))
        permon = 29;
    else if (month==2)
        permon = 28;
    else if (month!=2){
        switch(month)
        {
        case 1:case 3:case 5:case 7:case 8:case 10:case 12:permon = 31;break;
        default:permon = 30;break;
        }
    }
    return permon;
}

int sameyear(int year,int m1,int m2,int d1,int d2)
{
    int day=0;
    if(m1==m2)
        day = d2-d1;
    else
    {
        for(m2=m2-1;m2>m1;m2--)
        {
            day=day+month(year,m2);
        }
        day=d2+day+month(year,m1)-d1;
    }
    return day;
}

int leaprun(int y1,int y2)
{
    int cntr=0;
    while(y2!=y1)
    {
        y2--;
        if(runyear(y2)==366)
            cntr++;
    }
    return cntr;
}

int oneyearmoncnt(int year,int mon)
{
    int cnt=0;
    while(mon!=0)
    {
        cnt = cnt+month(year,mon);
        mon--;
    }
    return cnt;
}

int otheryear(int y1,int y2,int m1,int m2,int d1,int d2)
{
    int day=0;
    day = day+oneyearmoncnt(y2,m2-1)+d2+leaprun(y1+1,y2)*366+(y2-y1-1-leaprun(y1+1,y2))*365+runyear(y1)-oneyearmoncnt(y1,m1)+(month(y1,m1)-d1);
    return day;
}

int main()
{
    int year1,year2,month1,month2,day1,day2;

    scanf("%d %d %d %d %d %d",&year1,&month1,&day1,&year2,&month2,&day2);
    if(year1==year2)
        printf("采集时间为%d天",sameyear(year1,month1,month2,day1,day2));
    else
        printf("采集时间为%d天",otheryear(year1,year2,month1,month2,day1,day2));

    return 0;
}

9.取模

(循环)求n的阶乘mod 20181111的结果。输入n范围是(0<=n<=100),输出n!mod 20181111之后的数字。(即对20181111取余数)
样例输入:
5
样例输出:
120

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int n,i,c=20181111;
    unsigned long long sum=1;
    scanf("%d",&n);
    if (n==0)
        sum = 1;
    else
    {
        for(i=1;i<=n;i++)
        {
            sum=(sum*i)%c;
        }
    }
    printf("%llu",sum);
    return 0;
}

在这里插入图片描述
//用性质3,否者数据溢出

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值