C语言题目:用连分数求根号2,编程

C语言题目:用连分数求根号2,编程,第1张

#include <stdio.h>

#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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11828935.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存