level 11
#include<stdio.h>
#include<time.h>
int main(void)
{
void Fibonacci(int n);
int m;
printf("请输入Fibonacci第几项:");
scanf("%d",&m);
Fibonacci(m);
printf("\n");
}
void Fibonacci(int n)
{
void imitation_addition(char a[],char b[],char c[]);
char r[30000]={'\0'},s[30000]={'\0'},t[30000]={'\0'};
char *p1,*p2,*p3;
int i,j,counter;
int time;
time=clock();
p1=&r[0];
p2=&s[0];
p3=&t[0];
//printf("%d\n",n);
r[0]='1';
s[0]='1';
if(n<3)
t[0]='1';
if(n>2)
{
for(i=3;i<=n;i++)
{
imitation_addition(p1,p2,p3);
for(j=0;s[j]!='\0';j++)
{
r[j]=s[j];
}
for(j=0;t[j]!='\0';j++)
{
s[j]=t[j];
}
}
}
printf("费时:%d毫秒,%d秒\n",clock()-time,(clock()-time)/1000);
for(i=0;t[i]!='\0';i++)
{
counter=i;
}
printf("Fibonacci第%d项有%d位数.\n",n,counter);
printf("Fibonacci第%d项为:\n",n);
for(i=0;t[i]!='\0';i++)
{
printf("%c",t[i]);
}
}
void imitation_addition(char a[],char b[],char c[])
{
int i,j,k=0,temp=0,tempa=0,tempb=0;
int midvalue;
for(i=0;c[i]!='\0';i++)
c[i]='\0';
for(i=0;a[i]!='\0';i++)
tempa++;
for(i=0;b[i]!='\0';i++)
tempb++
2014年02月14日 04点02分
2
level 11
;
for(i=tempa-1,j=tempb-1;i>=0||j>=0;i--,j--,k++)
{
if(c[k]=='1')
{
if(i<0)
c[k]=c[k]+b[j]-'0';
else if(j<0)
c[k]=c[k]+a[i]-'0';
else
c[k]=c[k]+a[i]+b[j]-'0'-'0';
}
else
{
if(i<0)
c[k]=c[k]+b[j];
else if(j<0)
c[k]=c[k]+a[i];
else
c[k]=c[k]+a[i]+b[j]-'0';
}
if(c[k]>'9')
{
c[k+1]='1';
c[k]=c[k]-10;
}
}
for(i=0;c[i]!='\0';i++)//逆序存放字符数组
{
temp++;
}
for(i=0;i<temp/2;i++)
{
midvalue=*(c+i);
*(c+i)=*(c+temp-i-1);
*(c+temp-i-1)=midvalue;
}
}
2014年02月14日 04点02分
3
level 11
如果要变成递归的话应该怎么办还有就是怎么优化这个程序(写的非常烂)
2014年02月14日 04点02分
4
level 6
不是求和?
1。求某个项:
version1:
int main(){
printf("项数:");int n;
scanf("%d",&n);
int a,b,c;
if(n==1||n==2){c=1;}
if(n==3){c=2;}
else {
for(int i=0;i<n-3;i++){
//C99 i可声明在内
a=b;b=c;c=a+b; }
}
printf("\n第%d个项为",n);
printf(",有%d位",printf("%d",c));
return 0;}
version2: (递归效率低,且容易造成栈溢出)
int func(int n){
if(n==1||n==2){return 1;}
else {return func(n-1)+func(n-2);}
}
int main(){
printf("项数:");int n;
scanf("%d",&n);
printf("\n第%d个项为",n);
printf(",有%d位",
printf("%d",func(n)));
return 0;}
2014年02月14日 11点02分
5
你这个算法到后面就溢出了,比如我输入100,显示只有一位
2014年02月14日 12点02分
@regexepx 还有就是version1根本不是fibnacci的算法吧,第一万项才几十位
2014年02月14日 12点02分
level 6
2.求和通式
Sn={[(1+√5)/2]^(n+2)-[(1-√5)/2]^(n+2)}/√5-1
我也试着二项展开什么的化简,不过似乎没简化多少。
把优化参数开高点也差不多了。
#include "math.h"
int main(){
printf("项数:");int n;
scanf("%d",&n);
double t=sqrt(5.0);
printf("\n项数和为%d",(int)
(pow(0.5+0.5*t,n+2)+
pow(0.5-0.5*t,n+2) )/t-1 );
return 0;}
2014年02月14日 11点02分
6
还有就算是通项公式如果不用字符数组也会很快溢出
2014年02月14日 12点02分
@IveArthur 哦,知道了。如果是很大的数字,直接用python
2014年02月14日 12点02分
回复 regexepx :感觉就算是python写fib函数也算不了,我用的是 def fib(x): if x=1: return 1 elif x=2: return 1 else: return fib(x-1)+fib(x-2)
2014年02月14日 12点02分
level 6
printf("\n项数和为%d",(int)
(
(pow(0.5+0.5*t,n+2)+
pow(0.5-0.5*t,n+2) )/t-1
)
);
2014年02月14日 11点02分
7
level 6
So讨论结束?。。你这帖讨论的不是算法,是大数处理嘛。。我去研究下为何python不对(虽说慢也不至于这样。。)
2014年02月14日 13点02分
15
算结束吧~python也要靠特殊算法才能求值
2014年02月14日 13点02分