灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:10176回复:0

[C++技术]C++黄金连分数(高精度除法)

楼主#
更多 发布于:2013-05-12 12:55

/*标题: 黄金连分数
黄金分割数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!=0) { j=i; break; }
  for(int
i=j;i>=0;i--)
   printf("%d",x);
  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==0) length_x=i;
  if(y==0)
length_y=i;
temp_y=y;}//计算两个数字的长度  
//x[0]保存最低位  
for(int
i=0;i<1000;i++)
{
y=(x+y)+jinwei;
 jinwei=y/10;
 y=y%10;
//if(i<20)  
 //printf("i=%d
x_%d ,y_%d\n",i,x,y);  
}
for(int
i=0;i<1000;i++)
x=temp_y;
/*
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!=0) { j_x=i; break;
}//确定最高位  
  for(i=999;i>=0;i--)
  if(y!=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>y)
return 1;
  if(x<y) 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!=0) { j_x=i; break;
}//确定最高位  
  for(i=999;i>=0;i--)
  if(x!=0) { j_y=i; break;
}//确定最高位  
//从数的地位到高位依次相减    
for(i=0;i<=j_y;i++)
{
 if(x>=y)
{x=x-y; continue;}
 if(x<y)  {x=x+10-y;
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=y;
 xx=x;}//将两个数组保存起来以防止干扰原数组的值  
 
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++;
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=0;
}
for(i=0;i<1000;i++)
{x=y=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);
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!=0)
{ j=i; break; }
  for(int i=j;i>=0;i--)
   printf("%d",x);
  
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==0) length_x=i;
  if(y==0)
length_y=i;
temp_y=y;}//计算两个数字的长度
//x[0]保存最低位
for(int
i=0;i<1000;i++)
{
y=(x+y)+jinwei;
 jinwei=y/10;
 y=y%10;
//if(i<20)
 //printf("i=%d
x_%d ,y_%d\n",i,x,y);
}
for(int
i=0;i<1000;i++)
x=temp_y;
/*
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!=0) { j_x=i; break;
}//确定最高位
  for(i=999;i>=0;i--)
  if(y!=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>y) return
1;
  if(x<y) 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!=0) { j_x=i; break;
}//确定最高位
  for(i=999;i>=0;i--)
  if(x!=0) { j_y=i; break;
}//确定最高位
//从数的地位到高位依次相减
for(i=0;i<=j_y;i++)
{
 if(x>=y)
{x=x-y; continue;}
 if(x<y)  {x=x+10-y; 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=y;
 xx=x;}//将两个数组保存起来以防止干扰原数组的值
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++;
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=0;
}
for(i=0;i<1000;i++)
{x=y=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);
if(i%10==0)
printf("\n");
}
printf("\n");
system("pause");}

 
 

喜欢0 评分0
游客

返回顶部