程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 黃金連分數(高精度除法)

黃金連分數(高精度除法)

編輯:C++入門知識

/*標題: 黃金連分數
黃金分割數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");}


 

 

\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved