一个程序设计的问题请教,一个递推分数数列的构成规律为: 1/2, 3/5, 4/7, 6/10,...。C语言实现!

一个递推分数数列的构成规律为:1/2,3/5,4/7,6/10,...。设每一项的分子c与分母d(c、d为正整数),第i项的分母d与分子c存在以下关系:d=c+i;而c... 一个递推分数数列的构成规律为: 1/2, 3/5, 4/7, 6/10,...。设每一项的分子c与分母d(c、d为正整数),第i项的分母d与分子c存在以下关系:d=c+i;而c为与前i-1项中的所有分子分母均不相同的最小正整数。
求出该数列的第n(1<n<3000)项,并求出前n项中的最大项。
注:标准输入设备输入 n。

【样例输入】
1000
【样例输出】
1618/2618 //第n项
987/1597 //前n项中的最大项
展开
 我来答
windning
2013-03-29 · TA获得超过611个赞
知道小有建树答主
回答量:227
采纳率:0%
帮助的人:301万
展开全部
#include<stdio.h>
int sign[6002] = {0};
int main()
{
int n,c=1,d,i,max_c=1,max_d=2;
float tmp1,tmp2;
sign[1] = sign[2] = 1;
tmp2 = max_c*1.0/max_d;
scanf("%i",&n);
for(i=2;i<=n;i++)
{
for(int j=1;j<=6002;j++)
{
if(!sign[j])
{
c = j;
break;
}
}
d = c+i;
tmp1 = c*1.0/d;
if(tmp2<tmp1)
{
max_c = c;
max_d = d;
tmp2 = max_c*1.0/max_d;
}
if(c<6002)
sign[c] = 1;
if(d<6002)
sign[d] = 1;
}
printf("%i/%i\n",c,d);
printf("%i/%i",max_c,max_d);
return 0;
}
代码略丑,见谅,复杂度虽然不好看,不过这题好像3000也只要19毫秒而已。
追问
水平有限,不容易看懂啊
追答
嗯,好吧,大概说一下自己的想法:
首先为了要求出每次的C,所以需要把已经出现过的c和d都给记录下来,
所以开一个int数组(其实应该开bool数组,不过好像有些C语言编译器不支持bool?)。
开始的时候初始化成全0,然后每次求出c、d,就把他们的位置置1;
选c的方法是扫描那个标记数组,从头开始找到第一个内容为0(未出现过)的数。
关于这个数组的大小,由于n最大是3000,因此c不会取到6000以上的数,因此这样开。
所以在每次把c、d填成1的时候要防止越界。
就这样循环上n次,顺便记录最大数的分子和分母,循环完毕后就有了结果。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式