#include <math.h>
void main(void)
{
long double a=1/2,b=1
for()
{
a=1.0/(2+a)
if(fabs(sqrt(2)-b-a)<1.0e-6)
{
printf("结果是:%lf\n所以根号2即为所求的连分数值\n",a+b)
break
}
}
}
来自合工大自动化专业
#include <iostream>#include <sstream>
#include <iomanip>
#include <vector>
using namespace std
// 分数类别
class Fraction {
private :
// 分子 与 分母
int num , den
// 计算最大公因数
int gcd( int a , int b ) const {
if ( a >= b )
return ( a % b == 0 ? b : gcd(b,a%b) )
else
return ( b % a == 0 ? a : gcd(a,b%a) )
}
public :
// (1) 约分的建构函式
Fraction( int n = 0 , int d = 1 ) : num(n) , den(d) {
if ( num != 0 ) {
int g = gcd(num,den)
num /= g
den /= g
}
}
// (2) 不约分的建构函式
Fraction( int n , int d , int j ) : num(n) , den(d) {}
// 回传分子
int get_num() const { return num }
// 回传分母
int get_den() const { return den }
// 回传倒数
Fraction inverse() const { return Fraction(den,num) }
// 计算连分数表示数列
vector<int> continued_fraction_list() const {
vector<int> no
Fraction foo = *this
do {
no.push_back( foo.num/foo.den )
foo = foo - no.back()
foo = foo.inverse()
} while ( foo.den != 1 )
no.push_back( foo.num )
return no
}
// 计算所有渐近分数之值
vector<Fraction> generate_convergents() const {
vector<int> no = continued_fraction_list()
vector<Fraction> flist(no.size())
int i , j
Fraction sum
flist.front() = Fraction(no[0])
for ( i = 1 i <no.size()-1 ++i ) {
sum = Fraction(no[i])
for ( j = i j >0 --j )
sum = no[j-1] + sum.inverse()
flist[i] = sum
}
flist.back() = *this
return flist
}
// 夥伴函式:输出运算子
friend ostream&operator<<( ostream&out ,
const Fraction&foo ) {
ostringstream ostr
if ( foo.num == 0 )
ostr <<"0"
else
ostr <<foo.num <<"/" <<foo.den
return out <<ostr.str()
}
// 夥伴函式:加法运算子
friend Fraction operator+( const Fraction&a ,
const Fraction&b ) {
return Fraction(a.num*b.den+a.den*b.num,a.den*b.den)
}
// 夥伴函式:减法运算子
friend Fraction operator-( const Fraction&a ,
const Fraction&b ) {
return Fraction(a.num*b.den-a.den*b.num,a.den*b.den)
}
}
int main() {
int i
const int MDAYS = 295306
const int YDAYS = 3652422
const int SCALE = 10000
Fraction foo(YDAYS,MDAYS,0)
vector<int> no = foo.continued_fraction_list()
vector<Fraction> cno = foo.generate_convergents()
cout <<">" <<foo <<" = ["
for ( i = 0 i <no.size()-1 ++i )
cout <<no[i] <<( i == 0 ? "" : "," )
cout <<no.back() <<"] 的渐近分数 : \n"
for ( i = 0 i <cno.size() ++i ) {
cout <<"[" <<setw(2) <<i+1 <<"] "
<<setw(14) <<cno[i] <<""
if ( (i+1)%3 == 0 ) cout <<endl
}
cout <<"\n\n"
int M , Y
double min
cout <<">渐近分数所产生的闰月数 : \n"
for ( i = 0 i <cno.size() ++i ) {
M = cno[i].get_num()
Y = cno[i].get_den()
min = ( 1. * MDAYS * M - 1. * YDAYS * Y )*1440/SCALE/Y
cout <<"[" <<setw(2) <<i+1 <<"] 每 "
<<setw(6) << Y <<" 年 " <<setw(6) <<M - 12 * Y
<<" 个闰月,阴历平均每年比阳历"
<<( min >0 ? "多" : "少")
<<setprecision(6) <<fixed <<setw(13)
<<( min >= 0 ? min : -min ) <<" 分钟\n"
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)