document project euler till prob 12

This commit is contained in:
Krishna Vedala 2020-06-05 12:20:25 -04:00
parent 8242411530
commit dd40af2736
19 changed files with 230 additions and 84 deletions

View File

@ -1,14 +1,20 @@
/*An Efficient code to print all the sum of all numbers that are multiples of 3 /**
* & 5 below N.*/ * \file
* \brief [Problem 1](https://projecteuler.net/problem=1) solution
*
* An Efficient code to print all the sum of all numbers that are multiples of 3
* & 5 below N.
*/
#include <stdio.h> #include <stdio.h>
/** Main function */
int main() int main()
{ {
int t; int t;
printf("Enter number of times you want to try"); printf("Enter number of times you want to try");
scanf("%d", &t); scanf("%d", &t);
while (t--) while (t--) // while t > 0, decrement 't' before every iteration
{ {
unsigned long long N, p = 0, sum = 0; unsigned long long N, p = 0, sum = 0;
printf("Enter the value of N "); printf("Enter the value of N ");

View File

@ -1,14 +1,17 @@
/* /**
If we list all the natural numbers below 10 that are multiples of 3 or 5, * \file
we get 3,5,6 and 9. The sum of these multiples is 23. * \brief [Problem 1](https://projecteuler.net/problem=1) solution
Find the sum of all the multiples of 3 or 5 below N. *
''' * If we list all the natural numbers below 10 that are multiples of 3 or 5,
''' * we get 3,5,6 and 9. The sum of these multiples is 23.
This solution is based on the pattern that the successive numbers in the series * Find the sum of all the multiples of 3 or 5 below N.
follow: 0+3,+2,+1,+3,+1,+2,+3. *
*/ * This solution is based on the pattern that the successive numbers in the
* series follow: 0+3,+2,+1,+3,+1,+2,+3.
*/
#include <stdio.h> #include <stdio.h>
/** Main function */
int main() int main()
{ {
int n = 0; int n = 0;

View File

@ -1,14 +1,16 @@
/* /**
If we list all the natural numbers below 10 that are multiples of 3 or 5, * \file
we get 3,5,6 and 9. The sum of these multiples is 23. * \brief [Problem 1](https://projecteuler.net/problem=1) solution.
Find the sum of all the multiples of 3 or 5 below N. * This solution is based on the pattern that the successive numbers in the
''' * series follow: 0+3,+2,+1,+3,+1,+2,+3.
''' *
This solution is based on the pattern that the successive numbers in the series * If we list all the natural numbers below 10 that are multiples of 3 or 5,
follow: 0+3,+2,+1,+3,+1,+2,+3. * we get 3,5,6 and 9. The sum of these multiples is 23.
*/ * Find the sum of all the multiples of 3 or 5 below N.
*/
#include <stdio.h> #include <stdio.h>
/** Main function */
int main() int main()
{ {
int n = 0; int n = 0;
@ -49,4 +51,5 @@ int main()
} }
printf("%d\n", sum); printf("%d\n", sum);
return 0;
} }

View File

@ -1,8 +1,14 @@
/*An Efficient code to print all the sum of all numbers that are multiples of 3 /**
* & 5 below N.*/ * \file
* \brief [Problem 1](https://projecteuler.net/problem=1) solution
*
* An Efficient code to print all the sum of all numbers that are multiples of 3
* & 5 below N.
*/
#include <stdio.h> #include <stdio.h>
/** Main function */
int main() int main()
{ {
int t; int t;

View File

@ -1,19 +1,25 @@
/**
* \file
* \brief [Problem 10](https://projecteuler.net/problem=10) solution
*/
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
char is_prime(long n) /** Function to check if a number is prime */
char is_prime(unsigned long n)
{ {
for (long i = 2; i < sqrtl(n) + 1; i++) for (unsigned long i = 2; i < sqrtl(n) + 1; i++)
if (n % i == 0) if (n % i == 0)
return 0; return 0;
return 1; return 1;
} }
long long sum_of_primes(long N) /** Computes sum of prime numbers less than N */
unsigned long long sum_of_primes(unsigned long N)
{ {
long long sum = 2; unsigned long long sum = 2;
for (long i = 3; i < N; i += 2) /* skip even numbers */ for (long i = 3; i < N; i += 2) /* skip even numbers */
if (is_prime(i)) if (is_prime(i))
@ -22,14 +28,15 @@ long long sum_of_primes(long N)
return sum; return sum;
} }
/** Main function */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
long n = 100; unsigned long n = 100;
if (argc == 2) /* if command line argument is provided */ if (argc == 2) /* if command line argument is provided */
n = atol(argv[1]); /* use that as the upper limit */ n = atol(argv[1]); /* use that as the upper limit */
printf("%ld: %lld\n", n, sum_of_primes(n)); printf("%ld: %llu\n", n, sum_of_primes(n));
return 0; return 0;
} }

View File

@ -1,7 +1,12 @@
/**
* \file
* \brief [Problem 10](https://projecteuler.net/problem=10) solution
*/
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
/** Main function */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
long n = 100; long n = 100;

View File

@ -1,15 +1,21 @@
/**
* \file
* \brief [Problem 11](https://projecteuler.net/problem=11) solution
*/
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
/**
* Get number of divisors of a given number
*
* If \f$x = a \times b\f$, then both \f$a\f$ and \f$b\f$ are divisors of
* \f$x\f$. Since multiplication is commutative, we only need to search till a
* maximum of \f$a=b = a^2\f$ i.e., till \f$\sqrt{x}\f$. At every integer till
* then, there are eaxctly 2 divisors and at \f$a=b\f$, there is only one
* divisor.
*/
long count_divisors(long long n) long count_divisors(long long n)
/*
If x = a * b, then both a and b are divisors of x.
Since multiplication is commutative, we only need to search
till a maximum of a=b = a^2 i.e., till sqrt(x).
At every integer till then, there are eaxctly 2 divisors
and at a=b, there is only one divisor.
*/
{ {
long num_divisors = 0; long num_divisors = 0;
@ -22,6 +28,7 @@ long count_divisors(long long n)
return num_divisors; return num_divisors;
} }
/** Main function */
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int MAX_DIVISORS = 500; int MAX_DIVISORS = 500;

View File

@ -1,13 +1,19 @@
/* /**
Problem: * \file
Each new term in the Fibonacci sequence is generated by adding the previous two * \brief [Problem 2](https://projecteuler.net/problem=2) solution
terms. By starting with 1 and 2, the first 10 terms will be: *
1,2,3,5,8,13,21,34,55,89,.. * Problem:
By considering the terms in the Fibonacci sequence whose values do not exceed n, *
find the sum of the even-valued terms. e.g. for n=10, we have {2,8}, sum is 10. * Each new term in the Fibonacci sequence is generated by adding the previous
*/ * two terms. By starting with 1 and 2, the first 10 terms will be:
* `1,2,3,5,8,13,21,34,55,89,..`
* By considering the terms in the Fibonacci sequence whose values do not exceed
* n, find the sum of the even-valued terms. e.g. for n=10, we have {2,8}, sum
* is 10.
*/
#include <stdio.h> #include <stdio.h>
/** Main function */
int main() int main()
{ {
int n = 0; int n = 0;
@ -27,4 +33,5 @@ int main()
} }
printf("%d\n", sum); printf("%d\n", sum);
return 0;
} }

View File

@ -1,13 +1,18 @@
/* /**
Problem: * \file
The prime factors of 13195 are 5,7,13 and 29. What is the largest prime factor * \brief [Problem 3](https://projecteuler.net/problem=3) solution
of a given number N? e.g. for 10, largest prime factor = 5. For 17, largest *
prime factor = 17. * Problem:
*/ *
* The prime factors of 13195 are 5,7,13 and 29. What is the largest prime
* factor of a given number N? e.g. for 10, largest prime factor = 5. For 17,
* largest prime factor = 17.
*/
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
int isprime(int no) /** Check if the given number is prime */
char isprime(int no)
{ {
int sq; int sq;
@ -30,6 +35,7 @@ int isprime(int no)
return 1; return 1;
} }
/** Main function */
int main() int main()
{ {
int maxNumber = 0; int maxNumber = 0;
@ -69,4 +75,5 @@ int main()
printf("%d\n", maxNumber); printf("%d\n", maxNumber);
} }
} }
return 0;
} }

View File

@ -1,11 +1,16 @@
/* /**
Problem: * \file
The prime factors of 13195 are 5,7,13 and 29. What is the largest prime factor * \brief [Problem 3](https://projecteuler.net/problem=3) solution
of a given number N? e.g. for 10, largest prime factor = 5. For 17, largest *
prime factor = 17. * Problem:
*/ *
* The prime factors of 13195 are 5,7,13 and 29. What is the largest prime
* factor of a given number N? e.g. for 10, largest prime factor = 5. For 17,
* largest prime factor = 17.
*/
#include <stdio.h> #include <stdio.h>
/** Main function */
int main() int main()
{ {
int n = 0; int n = 0;
@ -24,4 +29,5 @@ int main()
if (n > 1) if (n > 1)
prime = n; prime = n;
printf("%d\n", prime); printf("%d\n", prime);
return 0;
} }

View File

@ -1,5 +1,14 @@
/**
* \file
* \brief [Problem 4](https://projecteuler.net/problem=4) solution
*/
#include <stdio.h> #include <stdio.h>
/** Check if number is palindromic
* \param[in] n number to check
* \returns 1 if palindromic
* \returns 0 if not palindromic
*/
int is_palindromic(unsigned int n) int is_palindromic(unsigned int n)
{ {
unsigned int reversed = 0, t = n; unsigned int reversed = 0, t = n;
@ -12,6 +21,7 @@ int is_palindromic(unsigned int n)
return reversed == n; return reversed == n;
} }
/** Main function */
int main(void) int main(void)
{ {
unsigned int i, j, max = 0; unsigned int i, j, max = 0;

View File

@ -1,3 +1,9 @@
/**
* \file
* \brief [Problem 401](https://projecteuler.net/problem=401) solution
*
* Sum of squares of divisors
*/
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -8,9 +14,17 @@
#include <omp.h> #include <omp.h>
#endif #endif
#define MOD (uint64_t)1e9 #define MOD (uint64_t)1e9 /**< modulo limit */
#define MAX_L 5000 #define MAX_L 5000 /**< chunk size of array allocation */
/**
* Check if a number is present in given array
* \param[in] N number to check
* \param[in] D array to check
* \param[in] L length of array
* \returns 1 if present
* \returns 0 if absent
*/
char is_in(uint64_t N, uint64_t *D, uint64_t L) char is_in(uint64_t N, uint64_t *D, uint64_t L)
{ {
uint64_t i; uint64_t i;
@ -20,6 +34,12 @@ char is_in(uint64_t N, uint64_t *D, uint64_t L)
return 0; return 0;
} }
/**
* Get all integer divisors of a number
* \param[in] N number to find divisors for
* \param[out] D array to store divisors in
* \returns number of divisors found
*/
uint64_t get_divisors(uint64_t N, uint64_t *D) uint64_t get_divisors(uint64_t N, uint64_t *D)
{ {
uint64_t q, r; uint64_t q, r;
@ -31,43 +51,49 @@ uint64_t get_divisors(uint64_t N, uint64_t *D)
return 1; return 1;
} }
// search till sqrt(N)
// because after this, the pair of divisors will repeat themselves
for (i = 1; i * i <= N + 1; i++) for (i = 1; i * i <= N + 1; i++)
{ {
r = N % i; r = N % i; // get reminder
// reminder = 0 if 'i' is a divisor of 'N'
if (r == 0) if (r == 0)
{ {
q = N / i; q = N / i;
if (!is_in(i, D, num)) if (!is_in(i, D, num)) // if divisor was already stored
{ {
D[num] = i; D[num] = i;
num++; num++;
} }
if (!is_in(q, D, num)) if (!is_in(q, D, num)) // if divisor was already stored
{ {
D[num] = q; D[num] = q;
num++; num++;
} }
} }
if (num == MAX_L)
if (num == MAX_L) // limit of array reached, allocate more space
D = (uint64_t *)realloc(D, MAX_L * sizeof(uint64_t) << 1); D = (uint64_t *)realloc(D, MAX_L * sizeof(uint64_t) << 1);
} }
return num; return num;
} }
/** /**
* sum of squares of all integer factors * compute sum of squares of all integer factors of a number
**/ * \param[in] N
* \returns sum of squares
*/
uint64_t sigma2(uint64_t N) uint64_t sigma2(uint64_t N)
{ {
uint64_t sum = 0, DD, L; uint64_t sum = 0, L;
int64_t i; int64_t i;
uint64_t *D = (uint64_t *)malloc(MAX_L * sizeof(uint64_t)); uint64_t *D = (uint64_t *)malloc(MAX_L * sizeof(uint64_t));
L = get_divisors(N, D); L = get_divisors(N, D);
for (i = 1; i < L; i++) for (i = 1; i < L; i++)
{ {
DD = (D[i] * D[i]) % MOD; uint64_t DD = (D[i] * D[i]) % MOD;
sum += DD; sum += DD;
} }
@ -78,13 +104,14 @@ uint64_t sigma2(uint64_t N)
/** /**
* sum of squares of factors of numbers * sum of squares of factors of numbers
* from 1 thru N * from 1 thru N
**/ */
uint64_t sigma(uint64_t N) uint64_t sigma(uint64_t N)
{ {
uint64_t s, sum = 0; uint64_t s, sum = 0;
int64_t i; int64_t i;
#ifdef _OPENMP #ifdef _OPENMP
// parallelize on threads
#pragma omp parallel for reduction(+ : sum) #pragma omp parallel for reduction(+ : sum)
#endif #endif
for (i = 0; i <= N; i++) for (i = 0; i <= N; i++)
@ -95,15 +122,17 @@ uint64_t sigma(uint64_t N)
return sum % MOD; return sum % MOD;
} }
/** Main function */
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
uint64_t N = 1000; uint64_t N = 1000;
if (argc == 2) if (argc == 2)
N = strtoll(argv[1], NULL, 10); N = strtoll(argv[1], NULL, 10);
else if (argc > 2) else if (N > 2)
{ {
fprintf(stderr, "Wrong number of input arguments!\n"); fprintf(stderr, "Wrong number of input arguments!\n");
printf("Usage:\t ./sol1.c [N=1000]");
return -1; return -1;
} }

View File

@ -1,5 +1,13 @@
/**
* \file
* \brief [Problem 5](https://projecteuler.net/problem=5) solution
*/
#include <stdio.h> #include <stdio.h>
/** Compute [Greatest Common Divisor
* (GCD)](https://en.wikipedia.org/wiki/Greatest_common_divisor) of two numbers
* using Euclids algorithm
*/
unsigned long gcd(unsigned long a, unsigned long b) unsigned long gcd(unsigned long a, unsigned long b)
{ {
unsigned long r; unsigned long r;
@ -17,12 +25,16 @@ unsigned long gcd(unsigned long a, unsigned long b)
return b; return b;
} }
/** Compute [Least Common Multiple
* (LCM)](https://en.wikipedia.org/wiki/Least_common_multiple) of two numbers
*/
unsigned long lcm(unsigned long a, unsigned long b) unsigned long lcm(unsigned long a, unsigned long b)
{ {
unsigned long long p = (unsigned long long)a * b; unsigned long long p = (unsigned long long)a * b;
return p / gcd(a, b); return p / gcd(a, b);
} }
/** Main function */
int main(void) int main(void)
{ {
unsigned long ans = 1; unsigned long ans = 1;

View File

@ -1,5 +1,10 @@
/**
* \file
* \brief [Problem 6](https://projecteuler.net/problem=6) solution
*/
#include <stdio.h> #include <stdio.h>
/** Main function */
int main(void) int main(void)
{ {
unsigned s1 = 0, s2 = 0, i; unsigned s1 = 0, s2 = 0, i;

View File

@ -1,6 +1,11 @@
/**
* \file
* \brief [Problem 7](https://projecteuler.net/problem=7) solution
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
/** Main function */
int main(void) int main(void)
{ {
char *sieve; char *sieve;
@ -9,7 +14,7 @@ int main(void)
size_t n = 1000000; size_t n = 1000000;
const unsigned target = 10001; const unsigned target = 10001;
sieve = calloc(n, sizeof *sieve); sieve = (char *)calloc(n, sizeof(char));
for (i = 2; i < n; i++) for (i = 2; i < n; i++)
{ {
if (!sieve[i]) if (!sieve[i])

View File

@ -1,6 +1,17 @@
/**
* \file
* \brief [Problem 8](https://projecteuler.net/problem=8) solution
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
/** Compute the product of two numbers in a file
*
* \param[in] fp pointer to file that is already open
* \param[in] start_pos line number of the first numer
* \param[in] num_digits number of digits on the line to multiply
* \returns expected product
*/
long long int get_product(FILE *fp, long start_pos, int num_digits) long long int get_product(FILE *fp, long start_pos, int num_digits)
{ {
char ch = ' '; /* temporary variable to store character read from file */ char ch = ' '; /* temporary variable to store character read from file */
@ -46,6 +57,7 @@ long long int get_product(FILE *fp, long start_pos, int num_digits)
return prod; return prod;
} }
/** Main function */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int position = 0; int position = 0;

View File

@ -1,7 +1,12 @@
/**
* \file
* \brief [Problem 8](https://projecteuler.net/problem=8) solution
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> /* for memmove */ #include <string.h> /* for memmove */
/** Main function */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int position = 0, num_bad_chars = 0; int position = 0, num_bad_chars = 0;

View File

@ -1,5 +1,11 @@
/**
* \file
* \brief [Problem 9](https://projecteuler.net/problem=9) solution - A naive
* implementation
*/
#include <stdio.h> #include <stdio.h>
/** Main function */
int main(void) int main(void)
{ {
for (int a = 1; a < 300; a++) for (int a = 1; a < 300; a++)

View File

@ -1,19 +1,24 @@
/**
* \file
* \brief [Problem 9](https://projecteuler.net/problem=9) solution
*
Problem Statement:
A Pythagorean triplet is a set of three natural numbers, \f$a < b < c\f$,
for which, \f$a^2 + b^2 = c^2\f$. For example, \f$3^2 + 4^2 = 9 + 16 = 25 =
5^2\f$. There exists exactly one Pythagorean triplet for which \f$a + b + c =
1000\f$. Find the product abc.
Given \f$a^2 + b^2 = c^2\f$ and \f$a+b+c = n\f$, we can write:
\f{eqnarray*}{
b &=& \frac{n^2 - 2an}{2n - 2a}\\
c &=& n - a - b
\f}
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
/** /** Main function */
Problem Statement:
A Pythagorean triplet is a set of three natural numbers, a < b < c, for
which, a^2 + b^2 = c^2 For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. There exists
exactly one Pythagorean triplet for which a + b + c = 1000. Find the product
abc.
Given a^2 + b^2 = c^2 and a+b+c = n, we can write:
b = (n^2 - 2*a*n) / (2*n - 2*a)
c = n - a - b
**/
int main(void) int main(void)
{ {
int N = 1000; int N = 1000;