锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
/**//*********************************************************************************
*鍚嶇О:LHRODT.h
*鐗堟湰鍙?0.1
*浣滆?璧佃(涓北澶у2010綰?
*鏃墮棿:2011.4.4
*綆浠?
* linear homogeneous relation of degree two鐨勮綆楀嚱鏁?褰㈠:
* a(n) = r1*a(n-1) + r2*a(n-2)
* 榪欐牱鐨勯掑綊鏁板垪錛屽彧闇璋冪敤鍑芥暟
* LHRODT( r1, r2, a1, a2, n )
* 鍗沖彲榪斿洖鏁板垪鐨勭a(n)欏?r1,r2,a1,a2鍧囦負double綾誨瀷,n涓篿nt綾誨瀷,榪斿洖綾誨瀷涓篸ouble).
* 榪欓噷r1,r2涓哄叕寮忎腑r1,r2,鑰宎1,a2涓烘暟鍒楃殑澶翠袱欏?n涓虹鍑犻」.鍑芥暟甯︾紦瀛樺姛鑳?鍗崇涓嬈?br>
* 璋冪敤鍚?涓嬫璋冪敤鍙互鍙緭鍏?br>
* LHRODT( n )
* .
*
*鏈畬鎴愮壒鎬?
* 1.涓嶅惈鏈夋暟鎹嫻嬪姛鑳?濡傛灉杈撳叆鐨勬暟鎹棤瑙?鍒欎細榪斿洖0.
* 2.綆媧佺増鐨勮皟鐢ㄤ笉鍖呭惈鏉′歡媯嫻嬫満鍒?濡傛灉涓嶆弧瓚蟲潯浠朵緷鐒朵細璋冪敤,浣嗘槸榪斿洖0.
* 3.鏈惈鏈夎寖鍥存嫻嬪姛鑳斤紝濡傛灉鏁版嵁鍑芥暟緇撴灉澧為暱寰堝揩錛屾湁鍙兘鍑虹幇鏁版嵁婧㈠嚭鑰屾病鏈変換浣曟彁紺?
*宸茬煡bug:
* 1.鏃犳硶澶勭悊鏃犺В鏁版嵁鐨勮緭鍏?
* 2.綆媧佺増鍦ㄦ湭璋冪敤瀹屽叏鐗堟垨鑰呭畬鍏ㄧ増璋冪敤澶辮觸鐨勬儏鍐典笅鍙繑鍥?.
* 3.鍙兘鍦ㄦ病鏈変換浣曟彁紺虹殑鎯呭喌涓嬪嚭鐜版暟鎹孩鍑?
*鐗堟潈淇℃伅:
* 璇ヤ唬鐮佷負寮婧愪唬鐮?鍘熶綔鑰呬繚鐣欏叾鎵鏈夋潈.浣犲彲浠ユ嫹璐?淇敼,浣跨敤璇ヤ唬鐮?浣嗘槸璇蜂繚鐣欏繀
* 瑕佺殑鐗堟潈淇℃伅.
*********************************************************************************/
#ifndef LHRODT_H
#define LHRODT_H
#include <cmath>
using std::pow;
class fsLHRODT //fs = function support

{
public:
fsLHRODT();
double operator()( double, double, double, double, int );
double operator()( int );
private:
double x1; //x1 x2 u1 u2 det 鍧囦負璁$畻榪囩▼鐨勪腑闂村彉閲?/span>
double x2; //result 涓烘渶鍚庣粨鏋滅殑涓存椂鍌ㄥ瓨
double u1;
double u2;
double det;
double result;
bool flag; //鏍囪瀹屽叏鐗堢殑鍑芥暟鏄惁琚皟鐢ㄨ繃
};
fsLHRODT::fsLHRODT()
: x1( 0 ), x2( 0 ), u1( 0 ), u2( 0 ), det( 0 ), result( 0 ), flag( false )

{
}
double fsLHRODT::operator()( double r1, double r2, double a1, double a2, int n )

{
flag = true;
det = r1*r1 + 4*r2;
if ( det < 0 ) //det灝忎簬0璇存槑杈撳叆鐨勬暟鎹笉鍚堟硶,涓嶈兘鎸夌収鍏紡璁$畻,騫朵笖涓嬫涓嶈兘鐩存帴璋冪敤綆媧佺増鍑芥暟
{
flag = false;
return 0;
}
else if ( det > 0 )
{
det = sqrt( det );
x1 = ( r1 + det ) / 2;
x2 = ( r1 - det ) / 2;
u1 = ( a1*x2 - a2 ) / ( x1*( x2 - x1 ) );
u2 = ( a2*x1 - a1 ) / ( x2*( x1 - x2 ) );
result = u1*pow( x1, n ) + u2*pow( x2, n );
return result;
}
else
{
x1 = r1 / 2;
u2 = ( a2 - x1*a1 ) / x1*x1;
u1 = a1 / x1 - u2;
result = ( u1 + u2*n ) * pow( x1, n );
return result;
}
}
double fsLHRODT::operator()( int n )

{
if ( flag )
{
if ( det < 0 )
return 0;
else if ( det > 0 )
{
result = u1*pow( x1, n ) + u2*pow( x2, n );
return result;
}
else
{
result = ( u1 + u2*n ) * pow( x1, n );
return result;
}
}
else
return 0;
}
fsLHRODT LHRODT;
#endif
]]>
#ifndef PROBABILITY_H
#define PROBABILITY_H
#include <cstdlib>
#include <iostream>
#include <ctime>
using namespace std;
bool probability( double p ) //澶ф鑳界簿紜埌灝忔暟鐐瑰悗涓浣?/span>

{
double happeness;
static bool flag = false;
if ( flag == false )
{
srand( time( NULL ) );
flag = true;
}

/**//*
happeness = rand() % 10001;
happeness /= 100;
榪欐牱鐨勮繍綆楀緱鍒扮殑鍊兼鐜囨槸涓嶆弧瓚抽鎰忕殑銆?br>
鎵浠and() %
榪欐牱鐨勮繍綆楀叾瀹炲茍娌℃湁瀹炵幇鐪熸鐨勫叕騫抽殢鏈恒?br>
*/
happeness = rand();
happeness /= RAND_MAX;
happeness *= 100;
return ( happeness <= p );
}
#endif
#ifndef FINDAN_H
#define FINDAN_H
#include <cmath>
// a(n) = r1*a(n-1) + r2*a(n-2), give the a1, a2, r1, r2 and n
double findAnWithDegreeOfTwo( double a1, double a2, double r1, double r2, int n )

{
double x1;
double x2;
double u1;
double u2;
double det = r1*r1 + 4*r2;
double result;
if ( det < 0 )
return 0;
else if ( det > 0 )
{
det = sqrt( det );
x1 = ( r1 + det ) / 2;
x2 = ( r1 - det ) / 2;
u1 = ( a1*x2 - a2 ) / ( x1*( x2 - x1 ) );
u2 = ( a2*x1 - a1 ) / ( x2*( x1 - x2 ) );
result = u1*pow( x1, n ) + u2*pow( x2, n );
return result;
}
else
{
x1 = r1 / 2;
u2 = ( a2 - x1*a1 ) / x1*x1;
u1 = a1 / x1 - u2;
result = ( u1 + u2*n ) * pow( x1, n );
return result;
}
}
#endif
#ifndef ZELLER_H
#define ZELLER_H
int Zeller( int y, int m, int d )

{
int c;
if ( m <= 2 )
{
m += 12;
y--;
}
c = y / 100;
y %= 100;
int w = ( y+(y/4)+(c/4)-2*c+(26*(m+1)/10)+d-1 ) % 7;
if ( w <= 0 )
w += 7;
return w;
}
#endif