着道算法题怎么做啊

sjzxtzhl 2008-04-06 10:57:56
Fibonacci 数列有如下特点:其第 1 , 2 项均为 1 , 1 。从第 3 个数开始,该数是其前两个数之和 . 即 :

F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1+Fn-2 (n>=3)
请你编写一个函数 fun ,它的功能是:对于一个给定的 数( N ), 求不大于 N 的最大 Fibonacci 数。
输入
输入的第一行是一个正整数,表示下面有几组数据需要计算。之后的每一行是一个数据 N ,其中 1 < N <= (10的1000次方) 。
输出
对应输入的每一行,输出一个 不大于 N 的最大 Fibonacci 数。
对应输入的每一行,输出一个 不大于 N 的最大 Fibonacci 数。

测试输入


以文本方式显示
1 2

2 9

3 1234567890

以文本方式显示
1 8

2 1134903170

...全文
524 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
micalmango 2010-10-06
  • 打赏
  • 举报
回复
那个编译出错时怎么回事
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
不明LZ在说什么
lijian1989 2008-04-17
  • 打赏
  • 举报
回复
貌似在poj上见到过 自己还太菜 不会做
崇拜楼上的高手们
Soulic 2008-04-17
  • 打赏
  • 举报
回复
学习了
c_spark 2008-04-13
  • 打赏
  • 举报
回复
必须使用大整数的,10^1000这是个什么概念...
使用整数数组来模拟求和就行啊
每一位存放一个0~9的整数,从个位往高位相加,>=10则进位
注意进位处理就行
sjzxtzhl 2008-04-11
  • 打赏
  • 举报
回复
出现便编译错误
main.c: In function `fibonacci':
main.c:58: error: stray '\302' in program
main.c:58: error: stray '\246' in program
main.c:58: error: stray '\302' in program
main.c:58: error: stray '\246' in program
main.c:58: error: syntax error before "n"
是怎么回事
yzzlijun 2008-04-08
  • 打赏
  • 举报
回复
#include<stdio.h>
void main()
{
int i=0,j=1,k,sum;
printf("%d",j);
for(k=1;k<=9;k++)
{
sum=i+j;
i=j;
j=sum;
printf(",%d",sum);
}
printf("\n");
}
p0303230 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sunnylyy 的回复:]
ACM的话:
大数加法,递归加动态规划。动态规划时可选择用哈西表存储。

实际应用的话,可建立一个存储文件(或数据库),遇到一个Fibonacci数,先去文件查找,没有则计算,计算之后再存入文件,方便后面的查找(也算是程序的自主学习功能了,呵呵)。
[/Quote]
这个好
貌似网站上的md5破解就是这样做的
p0303230 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sjzxtzhl 的回复:]
编译出错,是怎么回事呢
main.c: In function `fibonacci':
main.c:58: error: stray '\302' in program
main.c:58: error: stray '\246' in program
main.c:58: error: stray '\302' in program
main.c:58: error: stray '\246' in program
main.c:58: error: syntax error before "n"
[/Quote]

一定是输入法错误
汉字的“”等等
sjzxtzhl 2008-04-08
  • 打赏
  • 举报
回复
编译出错,是怎么回事呢
main.c: In function `fibonacci':
main.c:58: error: stray '\302' in program
main.c:58: error: stray '\246' in program
main.c:58: error: stray '\302' in program
main.c:58: error: stray '\246' in program
main.c:58: error: syntax error before "n"
  • 打赏
  • 举报
回复
LZ这个题目怎么感觉是大学时期的作业题目呢?呵呵!楼上的高手们都已经给出答案了,赶紧看看散分吧!呵呵!
languagec 2008-04-08
  • 打赏
  • 举报
回复
Fibonacci 数如果要到达10的1000次的话, 大概要到第10000个数左右的位置,
给这10000个Fibonacci建一个数组, 输入的N和该数组比较,就可以出来结果了.

ACM的话,这样的数量级还是可以接受的.
sunnylyy 2008-04-07
  • 打赏
  • 举报
回复
ACM的话:
大数加法,递归加动态规划。动态规划时可选择用哈西表存储。

实际应用的话,可建立一个存储文件(或数据库),遇到一个Fibonacci数,先去文件查找,没有则计算,计算之后再存入文件,方便后面的查找(也算是程序的自主学习功能了,呵呵)。
szduweibing 2008-04-07
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int fibonacci(int n);
int fun(int n);

int main(void)
{
int i,j;
int n;
int num;

printf("Input a number :");
scanf("%d",&i);

if(i<1)
printf("Input a error number\n");
else
{
for(j=0;j<i;j++)
{
printf("Input a number from 1 to 1000 :");
scanf("%d",&n);
num=fun(n);
if(num)
printf("%d\n",num);
}
}
return 0;
}

int fun(int n)
{
int i;
int num1,num2;

if(n<1)
{
printf("Input a error number\n");
return -1;
}
else
{
for(i=1;;)
{
num1=fibonacci(i);
i++;
num2=fibonacci(i);
if(num1<=n&&n<num2)
return num1;
}
}
}

int fibonacci(int n)
{
if(n==1 || n==2)
return 1;
else
return (fibonacci(n-1)+fibonacci(n-2));
}
mLee79 2008-04-07
  • 打赏
  • 举报
回复
如果有个大数库还是很方便的:

#include <stdio.h>
#include <assert.h>
#include <gmp.h>
#include <math.h>

#define XSMALL_FIB_NUM_N (64)

mpz_t x_small_fib_num[ XSMALL_FIB_NUM_N ];

void init()
{
int i;
mpz_init_set_ui( x_small_fib_num[0] , 0 );
mpz_init_set_ui( x_small_fib_num[1] , 1 );
for( i = 2; i < XSMALL_FIB_NUM_N; ++i )
{
mpz_init(x_small_fib_num[i]);
mpz_add( x_small_fib_num[i] , x_small_fib_num[i-1] , x_small_fib_num[i-2] );
}
}

mpz_ptr get_small_fib( mpz_ptr r , mpz_srcptr x )
{
int i;
for( i = XSMALL_FIB_NUM_N - 1; i > 0 ; --i )
{
if( mpz_cmp( x , x_small_fib_num[i] ) >= 0 )
break;
}
mpz_set( r , x_small_fib_num[i] );
return r;
}

mpz_ptr get_fib( mpz_ptr r , mpz_srcptr x )
{
static const double l2 = .69314718055994529 , ls5 = .80471895621705025 , lfl = .48121182505960347;
if( mpz_cmp( x , x_small_fib_num[ XSMALL_FIB_NUM_N-1] ) <= 0 )
return get_small_fib( r , x );
else
{
double ex ;
signed long int bit2 ;
unsigned long N ;
mpz_t fN_1 ;

mpz_init( fN_1 );
ex = mpz_get_d_2exp( &bit2 , x );
N = (unsigned)( .5 + ( ls5 + bit2 * l2 + log( ex ) ) / lfl );

mpz_fib2_ui( r , fN_1 , N );
if( mpz_cmp( r , x ) > 0 )
mpz_swap( r , fN_1 );
mpz_clear( fN_1 );
return r;
}
}

int main()
{
mpz_t r , FN;
int X = -1;
init();

mpz_init( r );
mpz_init( FN );

gmp_printf( "%Zd\n" , x_small_fib_num[XSMALL_FIB_NUM_N-1] );

scanf( "%d" , &X );
while( X-- > 0 && 1 == gmp_scanf( "%Zd" , FN ) )
gmp_printf( "%Zd\n" , get_fib( r , FN ) );
mpz_clear( r );
mpz_clear( FN );
return 0;
}

帅得不敢出门 2008-04-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 baihacker 的回复:]
{[(1+√5)/2]^n -[(1+√5)/2]^n}/√5
看看能不能利用
[/Quote]

这个貌似很专业啊 只是看不懂
baihacker 2008-04-07
  • 打赏
  • 举报
回复
{[(1+√5)/2]^n -[(1+√5)/2]^n}/√5
看看能不能利用
Supper_Jerry 2008-04-06
  • 打赏
  • 举报
回复
如果测试数据很多最好的办法是提前建立Fibonacci 表
然后二分查表。
  • 打赏
  • 举报
回复

ACM ?
wrong1121 2008-04-06
  • 打赏
  • 举报
回复

while(i<n)
{
scanf("%d",&counter);
s1=s2=s=1;
while(s<=counter)
{
s=s1+s2;
s2=s1;
s1=s;
}
printf("%d ",s1);
i++;
}
这是核心,其余自己补!

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧