Solution to problem number 65 of Project
Euler
Question # 65
Question # 65
The square root of 2 can be written as an infinite continued fraction.
The infinite continued fraction can be written, 2 = [1;(2)], (2) indicates that 2 repeats ad infinitum. In a similar way, 23 = [4;(1,3,1,8)].
It turns out that the sequence of partial values of continued fractions for square roots provide the best rational approximations. Let us consider the convergents for 2.
Hence the sequence of the first ten convergents for 2 are:
e = [2; 1,2,1, 1,4,1, 1,6,1 , ... , 1,2k,1, ...].
The first ten terms in the sequence of convergents for e are:
Find the sum of digits in the numerator of the 100th convergent of the continued fraction for e.
Solution:-
/****************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#define max 100
int n[max]={0},pn[max]={0};
void fun(int);
void print(int*);
void assignArray(int*,int*);
void add(int*,int*);
int main()
{
int i,sum=0;
for(i=1;i<=100;i++)
{
fun(i);
/*
printf("i=%d=>",i);
print(n);
*/
}
for(i=0;i<max;i++)
sum+=n[i];
printf("answer = %d\n",sum);
return 0;
}
void print(int *arr)
{
int flag=0,i;
for(i=0;i<max;i++)
{
if(arr[i] || flag)
{
flag=1;
printf("%d",arr[i]);
}
}
printf("\n");
}
void add(int*a,int*b)
{
int i;
for(i=max-1;i>0;i--)
{
a[i]+=b[i];
if(a[i]>9)
{
a[i]%=10;
a[i-1]+=1;
}
}
}
void assignArray(int*a,int*b)
{
int i;
for(i=0;i<max;i++)
a[i]=b[i];
}
void fun(int x)
{
long long int flag;
int i,tmpn[max]={0},tmpArr[max]={0};
if(x==1)
{
n[max-1]=2;
return;
}
if(x==2)
{
pn[max-1]=2;
n[max-1]=3;
return;
}
if(x%3==0)
{
assignArray(tmpn,n);
flag=(x/3)*2;
for(i=0;i<flag;i++)
add(tmpArr,n);
add(tmpArr,pn);
assignArray(n,tmpArr);
assignArray(pn,tmpn);
return;
}
assignArray(tmpn,n);
add(n,pn);
assignArray(pn,tmpn);
}
/****************************************************************************/
2 = 1 + |
1
|
|||
2 + |
1
|
|||
2 + |
1
|
|||
2 + |
1
|
|||
2 + ... |
It turns out that the sequence of partial values of continued fractions for square roots provide the best rational approximations. Let us consider the convergents for 2.
1 + |
1
|
= 3/2 |
2
|
1 + |
1
|
= 7/5 | |
2 + |
1
|
||
2
|
1 + |
1
|
= 17/12 | ||
2 + |
1
|
|||
2 + |
1
|
|||
2
|
1 + |
1
|
= 41/29 | |||
2 + |
1
|
||||
2 + |
1
|
||||
2 + |
1
|
||||
2
|
1, 3/2, 7/5, 17/12, 41/29, 99/70, 239/169, 577/408, 1393/985, 3363/2378, ...
What is most surprising is that the important mathematical constant,e = [2; 1,2,1, 1,4,1, 1,6,1 , ... , 1,2k,1, ...].
The first ten terms in the sequence of convergents for e are:
2, 3, 8/3, 11/4, 19/7, 87/32, 106/39, 193/71, 1264/465, 1457/536, ...
The sum of digits in the numerator of the 10th convergent is 1+4+5+7=17.Find the sum of digits in the numerator of the 100th convergent of the continued fraction for e.
Solution:-
/****************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#define max 100
int n[max]={0},pn[max]={0};
void fun(int);
void print(int*);
void assignArray(int*,int*);
void add(int*,int*);
int main()
{
int i,sum=0;
for(i=1;i<=100;i++)
{
fun(i);
/*
printf("i=%d=>",i);
print(n);
*/
}
for(i=0;i<max;i++)
sum+=n[i];
printf("answer = %d\n",sum);
return 0;
}
void print(int *arr)
{
int flag=0,i;
for(i=0;i<max;i++)
{
if(arr[i] || flag)
{
flag=1;
printf("%d",arr[i]);
}
}
printf("\n");
}
void add(int*a,int*b)
{
int i;
for(i=max-1;i>0;i--)
{
a[i]+=b[i];
if(a[i]>9)
{
a[i]%=10;
a[i-1]+=1;
}
}
}
void assignArray(int*a,int*b)
{
int i;
for(i=0;i<max;i++)
a[i]=b[i];
}
void fun(int x)
{
long long int flag;
int i,tmpn[max]={0},tmpArr[max]={0};
if(x==1)
{
n[max-1]=2;
return;
}
if(x==2)
{
pn[max-1]=2;
n[max-1]=3;
return;
}
if(x%3==0)
{
assignArray(tmpn,n);
flag=(x/3)*2;
for(i=0;i<flag;i++)
add(tmpArr,n);
add(tmpArr,pn);
assignArray(n,tmpArr);
assignArray(pn,tmpn);
return;
}
assignArray(tmpn,n);
add(n,pn);
assignArray(pn,tmpn);
}
/****************************************************************************/
No comments:
Post a Comment