欧拉计划Problem 57

It is possible to show that the square root of two can be expressed as an infinite continued fraction.

√ 2 = 1 + 1/(2 + 1/(2 + 1/(2 + ... ))) = 1.414213...

By expanding this for the first four iterations, we get:

1 + 1/2 = 3/2 = 1.5
1 + 1/(2 + 1/2) = 7/5 = 1.4
1 + 1/(2 + 1/(2 + 1/2)) = 17/12 = 1.41666...
1 + 1/(2 + 1/(2 + 1/(2 + 1/2))) = 41/29 = 1.41379...

The next three expansions are 99/70, 239/169, and 577/408, but the eighth expansion, 1393/985, is the first example where the number of digits in the numerator exceeds the number of digits in the denominator.

In the first one-thousand expansions, how many fractions contain a numerator with more digits than denominator?



#define N 1000
#define M 100


void add(int mo[],int de[]);
void assignment(int dv[],int de[]);
bool check(int mole[], int denom[]);


bool check(int mole[], int denom[])
{
char lmo[5],lde[5];
for (int i = 0; mole[i] != 0;i++);
i--;
sprintf(lmo,"%d",mole[i]);
sprintf(lde,"%d",denom[i]);
if (denom[i] == 0)
{
return true;
}
if (strlen(lmo)>strlen(lde))
{
return true;
}
return false;
}


void add(int mo[],int de[])
{
for (int i =0,d = 0,temp = 0; i < M ; i++)
{
temp = de[i]+mo[i]+d;
de[i] = temp%10000;
d = temp/10000;
}
}


void assignment(int dv[],int de[])
{
for (int i = 0; i < M; i++)
{
dv[i] = de[i];
}
}


int main()
{
clock_t ts,te;
ts=clock();
int answer = 0;
int mole[M]={0},denom[M]={0},d_val[M]={0};
int n;
for (n = 1,mole[0] = 3,denom[0] = 2,d_val[0] = 0; n <= N;n++)
{
if (check(mole,denom) == true)
{
answer++;
}
assignment(d_val,denom);
add(mole,denom);
add(denom,d_val);
assignment(mole,d_val);
}
printf("\nanswer %d",answer);
te=clock();
printf("\ntime difference: %ds\n",(te-ts)/CLOCKS_PER_SEC);
getchar();
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值