/*标题: 黄金连分数
黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。
对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!
言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。
比较简单的一种是用连分数:
黄金数 = ---------------------
1
1 + -----------------
1
1 + -------------
1
1 + ---------
1 + ...
这个连分数计算的“层数”越多,它的值越接近黄金分割数。
请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。
小数点后3位的值为:0.618
小数点后4位的值为:0.6180
小数点后5位的值为:0.61803
小数点后7位的值为:0.6180340
(注意尾部的0,不能忽略)
你的任务是:写出精确到小数点后100位精度的黄金分割值。
注意:尾数的四舍五入! 尾数是0也要保留!
显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
*/
[cpp]
#include"stdio.h"
#include"stdlib.h"
int a[101];//a保存小数结果
int c[9000];//用来保存被除数的每一位
int point;//记录小数点的位置
int print(int x[])
{int j;
for(int i=999;i>=0;i--)
if(x[i]!=0) { j=i; break; }
for(int i=j;i>=0;i--)
printf("%d",x[i]);
printf("\n");
return 1;
} //输出一个数组中保存的值
int add(int x[],int y[])
{ int length_x,length_y;
int jinwei=0;//记录进位
int temp_y[1000];
for(int i=0;i<1000;i++)
{ if(x[i]==0) length_x=i;
if(y[i]==0) length_y=i;
temp_y[i]=y[i];}//计算两个数字的长度
//x[0]保存最低位
for(int i=0;i<1000;i++)
{ y[i]=(x[i]+y[i])+jinwei;
jinwei=y[i]/10;
y[i]=y[i]%10;
//if(i<20)
//printf("i=%d x_%d ,y_%d\n",i,x[i],y[i]);
}
for(int i=0;i<1000;i++)
x[i]=temp_y[i];
/*
printf("x: ");
print(x);
printf("y: ");
print(y);
*/
return 1;
}
int subcmp(int x[],int y[])
{//x[0]是最低位
int j_x,j_y,j,i;
for(i=999;i>=0;i--)
if(x[i]!=0) { j_x=i; break; }//确定最高位
for(i=999;i>=0;i--)
if(y[i]!=0) { j_y=i; break; }//确定最高位
if(j_x>j_y) return 1;//x中的值大于y中的
if(j_x<j_y) return -1;//x中的值小于于y中的
if(j_x==j_y)//当两个数位数相同的时候
{for(i=j_x;i>=0;i--)
{if(x[i]>y[i]) return 1;
if(x[i]<y[i]) return -1;}
return 0;
}
}//比较两个数数组里面保存的数字的大小
//两个数相减,结果保存在x[]中
int sub(int x[],int y[])
{//这里保证x[]>y[]
int j_x,j_y,j,i;
//for(i=999;i>=0;i--)
//if(x[i]!=0) { j_x=i; break; }//确定最高位
for(i=999;i>=0;i--)
if(x[i]!=0) { j_y=i; break; }//确定最高位
//从数的地位到高位依次相减
for(i=0;i<=j_y;i++)
{
if(x[i]>=y[i]) {x[i]=x[i]-y[i]; continue;}
if(x[i]<y[i]) {x[i]=x[i]+10-y[i]; x[i+1]--; }
}
return 1;
}
int xiaoshu(int x[1000],int y[1000])
{ int xx[1000],yy[1000];
for(int i=0;i<1000;i++)
{yy[i]=y[i];
xx[i]=x[i];}//将两个数组保存起来以防止干扰原数组的值
for(int i=0;i<101;i++)
{ if(subcmp(xx,yy)==-1)
{a[i++]=0;
for(int j=999;j>=1;j--)
xx[j]=xx[j-1];
xx[0]=0;//扩大十倍,相当于
}
while(subcmp(xx,yy)>=0)
{a[i]++;
sub(xx,yy);
}
for(int j=999;j>=1;j--)
xx[j]=xx[j-1];
xx[0]=0;//每算完一位,扩大十倍
}//end for i
return 1;}
int main()
{int print(int x[]);
int add(int x[],int y[]);
int xiaoshu(int x[1000],int y[1000]);
long long int b[200];
int x[1000],y[1000];
int i;
b[0]=1;
b[1]=2;
for(i=0;i<101;i++)
{a[i]=0;
}
for(i=0;i<1000;i++)
{x[i]=y[i]=0;
}
x[0]=1;
y[0]=2;
for(i=0;i<300;i++)
add(x,y);
printf("此时被除数的值是:\n");
print(x);
printf("此时除数的值是:\n");
print(y);
xiaoshu(x,y);
//printf("%d",sub(y,x));
//xiaoshu(b[i-2],b[i-1]);
printf("0.");
for(i=1;i<101;i++)
{printf("%d ",a[i]);
if(i%10==0)
printf("\n");
}
printf("\n");
system("pause");}
#include"stdio.h"
#include"stdlib.h"
int a[101];//a保存小数结果
int c[9000];//用来保存被除数的每一位
int point;//记录小数点的位置
int print(int x[])
{int j;
for(int i=999;i>=0;i--)
if(x[i]!=0) { j=i; break; }
for(int i=j;i>=0;i--)
printf("%d",x[i]);
printf("\n");
return 1;
} //输出一个数组中保存的值
int add(int x[],int y[])
{ int length_x,length_y;
int jinwei=0;//记录进位
int temp_y[1000];
for(int i=0;i<1000;i++)
{ if(x[i]==0) length_x=i;
if(y[i]==0) length_y=i;
temp_y[i]=y[i];}//计算两个数字的长度
//x[0]保存最低位
for(int i=0;i<1000;i++)
{ y[i]=(x[i]+y[i])+jinwei;
jinwei=y[i]/10;
y[i]=y[i]%10;
//if(i<20)
//printf("i=%d x_%d ,y_%d\n",i,x[i],y[i]);
}
for(int i=0;i<1000;i++)
x[i]=temp_y[i];
/*
printf("x: ");
print(x);
printf("y: ");
print(y);
*/
return 1;
}
int subcmp(int x[],int y[])
{//x[0]是最低位
int j_x,j_y,j,i;
for(i=999;i>=0;i--)
if(x[i]!=0) { j_x=i; break; }//确定最高位
for(i=999;i>=0;i--)
if(y[i]!=0) { j_y=i; break; }//确定最高位
if(j_x>j_y) return 1;//x中的值大于y中的
if(j_x<j_y) return -1;//x中的值小于于y中的
if(j_x==j_y)//当两个数位数相同的时候
{for(i=j_x;i>=0;i--)
{if(x[i]>y[i]) return 1;
if(x[i]<y[i]) return -1;}
return 0;
}
}//比较两个数数组里面保存的数字的大小
//两个数相减,结果保存在x[]中
int sub(int x[],int y[])
{//这里保证x[]>y[]
int j_x,j_y,j,i;
//for(i=999;i>=0;i--)
//if(x[i]!=0) { j_x=i; break; }//确定最高位
for(i=999;i>=0;i--)
if(x[i]!=0) { j_y=i; break; }//确定最高位
//从数的地位到高位依次相减
for(i=0;i<=j_y;i++)
{
if(x[i]>=y[i]) {x[i]=x[i]-y[i]; continue;}
if(x[i]<y[i]) {x[i]=x[i]+10-y[i]; x[i+1]--; }
}
return 1;
}
int xiaoshu(int x[1000],int y[1000])
{ int xx[1000],yy[1000];
for(int i=0;i<1000;i++)
{yy[i]=y[i];
xx[i]=x[i];}//将两个数组保存起来以防止干扰原数组的值
for(int i=0;i<101;i++)
{ if(subcmp(xx,yy)==-1)
{a[i++]=0;
for(int j=999;j>=1;j--)
xx[j]=xx[j-1];
xx[0]=0;//扩大十倍,相当于
}
while(subcmp(xx,yy)>=0)
{a[i]++;
sub(xx,yy);
}
for(int j=999;j>=1;j--)
xx[j]=xx[j-1];
xx[0]=0;//每算完一位,扩大十倍
}//end for i
return 1;}
int main()
{int print(int x[]);
int add(int x[],int y[]);
int xiaoshu(int x[1000],int y[1000]);
long long int b[200];
int x[1000],y[1000];
int i;
b[0]=1;
b[1]=2;
for(i=0;i<101;i++)
{a[i]=0;
}
for(i=0;i<1000;i++)
{x[i]=y[i]=0;
}
x[0]=1;
y[0]=2;
for(i=0;i<300;i++)
add(x,y);
printf("此时被除数的值是:\n");
print(x);
printf("此时除数的值是:\n");
print(y);
xiaoshu(x,y);
//printf("%d",sub(y,x));
//xiaoshu(b[i-2],b[i-1]);
printf("0.");
for(i=1;i<101;i++)
{printf("%d ",a[i]);
if(i%10==0)
printf("\n");
}
printf("\n");
system("pause");}