Solution to problem
number 40 of Project Euler.
Question #40
An irrational decimal fraction is created by concatenating the positive
integers:
0.123456789101112131415161718192021...
It can be seen that the 12th digit of the fractional part is 1.If dn represents the nth digit of the fractional part, find the value of the following expression.
d1
d10
d100
d1000
d10000
d100000
d1000000






Solution #40
/***********************************************************************************************************/
#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
long count_digits(long);
long count_digits_upto(long);
int d(long);
int ith(long,long);
int main()
{
long product=1;
int i;
for(i=0;i<7;i++)
product*=d((long)pow(10.0,i));
printf("%ld\n",product);
printf("EXECUTION
TIME = %f\n",clock()/(float)CLK_TCK);
system("pause");
}
int d(long n)
{
int ans;
long i,tmp;
i=getNumber(n);
tmp=count_digits_upto(i-1);
ans=ith(n-tmp,i);
return ans;
}
int ith(long i,long n)
{
int digits,j;
digits=count_digits(n);
for(j=0;j<digits-i;j++)
n/=10;
return n%10;
}
long count_digits_upto(long n)
{
long counter=0,i;
for(i=1;i<=n;i++)
counter+=count_digits(i);
return counter;
}
long getNumber(long n)
{
long i,counter=0,product;
for(i=1;i<=n;i++)
{
counter+=count_digits(i);
if(counter>=n)
break;
}
return i;
}
long count_digits(long i)
{
int counter=0;
while(i)
{
counter++;
i/=10;
}
return counter;
}
/***********************************************************************************************************/
No comments:
Post a Comment