2022.12.30

题目1 斐波那契数列

编写一个求斐波那契数列的递归函数,输入n值,使用该递归函数,输出如样例输出的斐波那契数列。

输入

一个整型数n

输出

题目可能有多组不同的测试数据,对于每组输入数据,
按题目的要求输出相应的斐波那契图形。

样例输入 复制

6

样例输出 复制

0
0 1 1
0 1 1 2 3
0 1 1 2 3 5 8
0 1 1 2 3 5 8 13 21
0 1 1 2 3 5 8 13 21 34 55

提示

数据的最大值不会超过long long的范围

分析

#include<stdio.h>
long long fun(long long n)
{
    if(n==0)
        return 0;
    else if(n==1)
        return 1;
    else return fun(n-1)+fun(n-2);
}
int main()
{
    int n;

    while(scanf("%lld",&n)!=EOF)
    {
       if(n==0) break;
       for(int i=0;i<n;i++)
       {
           for(int j=0;j<2*i+1;j++)
            printf("%lld ",fun(j));
           printf("\n");
       }
       printf("\n");
    }
    return 0;
}

一开始我想的很简单,就一个循环输出加一个递归函数,但是很显然行不通,时间超限,似乎因为whil本身就是一个循环体了,然后在循环体里面再套一个for循环体,越到后面时间越久,所以会时间超限,然后我看着数据,想着我不循环直接利用递归输出,想着想着就思路出来了。

#include<stdio.h>
long long  fun(long long n)
{
    if(n==0)
        return 0;

    else
        fun(n-1);
    int a=1,b=1,t;
    printf("0");
    for(int i=1;i<n;i++)
    {
        printf(" %lld %lld",a,b);
        t=a+b;
        a=t;
        b=b+t;
    }
printf("\n");
}
int main()
{
    long long n;
    while(scanf("%lld",&n)!=EOF)
    {
        fun(n);
    }
    return 0;
}

题目2 

问题 H: 小兔子的果园

题目描述

小兔子有n个果园,果园里有许多果树,有苹果树,芒果树,香蕉树,李子树,无花果树。
终于到了丰收的季节,小兔子从每个果园采了许多的水果,现在小兔子想给每个果园的产量排序。
因为小兔子爱吃芒果,所以按芒果的数量从大到小排序,如果芒果的数量相同,那就按照其他水果的总数量从小到大排序。
不会存在芒果数量相同且其他水果的总数量相同的情况。

输入

第一行输入一个n,代表n个果园(1<=n<=10)
接下来n行,每行五个数,分别代表小兔子从果园里采摘的苹果数量,芒果数量,香蕉数量,李子数量,无花果数量
每个水果的数量不超过10,且没有负数。

输出

输出n个果园产量排序后的结果

样例输入 复制

5
1 2 3 4 5
1 3 3 4 5
1 4 2 2 2
1 1 1 1 1
1 4 1 1 1

样例输出 复制

1 4 1 1 1
1 4 2 2 2
1 3 3 4 5
1 2 3 4 5
1 1 1 1 1

分析

这个题目可以很好的诠释结构体的妙处。

如:如果你不用结构体

#include<stdio.h>
int a[10],b[10],c[10],d[10],e[10],a1[10],b1[10],c1[10],d1[10],e1[10];//a苹果b芒果c香蕉d李子e无花果t交换时使用;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d %d %d %d %d",&a[i],&b[i],&c[i],&d[i],&e[i]);
    }
     for(int i=0; i<n; i++)
    {
        for(int j=0; j<n-i; j++)
        {
            if(b[j]<b[j+1])  //按照芒果的数量从大到小排序
            {
                a1[j]=a[j];
                    a[j]=a[j+1];
                    a[j+1]=a1[j];

                    b1[j]=b[j];
                    b[j]=b[j+1];
                    b[j+1]=b1[j];

                    c1[j]=c[j];
                    c[j]=c[j+1];
                    c[j+1]=c1[j];

                    d1[j]=d[j];
                    d[j]=d[j+1];
                    d[j+1]=d1[j];

                    e1[j]=e[j];
                    e[j]=e[j+1];
                    e[j+1]=e1[j];
            }
            if(b[j]==b[j+1])  //芒果数量相等,则按其他水果数量之和从小到大排序
            {
                if(a[j]+c[j]+d[j]+e[j]>a[j+1]+c[j+1]+d[j+1]+e[j+1])
                {
                    a1[j]=a[j];
                    a[j]=a[j+1];
                    a[j+1]=a1[j];

                    b1[j]=b[j];
                    b[j]=b[j+1];
                    b[j+1]=b1[j];

                    c1[j]=c[j];
                    c[j]=c[j+1];
                    c[j+1]=c1[j];

                    d1[j]=d[j];
                    d[j]=d[j+1];
                    d[j+1]=d1[j];

                    e1[j]=e[j];
                    e[j]=e[j+1];
                    e[j+1]=e1[j];

                }
            }
        }
    }

    for(int i=0;i<n;i++)
    {
        printf("%d %d %d %d %d\n",a[i],b[i],c[i],d[i],e[i]);
    }
}

但是你使用结构体后发现明显简便多了。

#include<stdio.h>
struct tree
{
    int a,b,c,d,e;
} s[10];
struct tree t[10];  用于排序时的交换
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%d %d %d %d %d",&s[i].a,&s[i].b,&s[i].c,&s[i].d,&s[i].e);
    }
    for(int i=0; i<n-1; i++)
    {
        for(int j=0; j<n-i-1; j++)
        {
            if(s[j].b<s[j+1].b)  
            {
                t[j]=s[j];
                s[j]=s[j+1];
                s[j+1]=t[j];
            }
            if(s[j].b==s[j+1].b)  
            {
                if(s[j].a+s[j].c+s[j].d+s[j].e>s[j+1].a+s[j+1].c+s[j+1].d+s[j+1].e)
                {
                    t[j]=s[j];
                    s[j]=s[j+1];
                    s[j+1]=t[j];
                }
            }
        }
    }
    for(int i=0; i<n; i++)
    {
        printf("%d %d %d %d %d\n",s[i].a,s[i].b,s[i].c,s[i].d,s[i].e);
    }
return 0;
}
 

所以要多学习你才能发现自己的渺小与无知

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值