题目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;
}
所以要多学习你才能发现自己的渺小与无知