Add comments

Added comments to the code of the first 5 problems in C.
This commit is contained in:
daniele 2019-09-22 17:48:52 +02:00
parent f8cce530b5
commit 7f64f15e89
Signed by: fuxino
GPG Key ID: 6FE25B4A3EE16FDA
8 changed files with 104 additions and 43 deletions

View File

@ -1,3 +1,7 @@
/* 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.
*
* Find the sum of all the multiples of 3 or 5 below 1000.*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
@ -10,7 +14,9 @@ int main(int argc, char **argv)
clock_gettime(CLOCK_MONOTONIC, &start);
for(i = 1; i < 1000; i++)
/* Simple brute-force approach: try every number between 3 and 999,
* check if it's a multiple of 3 or 5, if yes add it to the total.*/
for(i = 3; i < 1000; i++)
{
if (i % 3 == 0 || i % 5 == 0)
{

View File

@ -1,7 +1,15 @@
/* 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 four million, find the sum of the even-valued terms.*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 4000000
int main(int argc, char **argv)
{
int fib0 = 1, fib1 = 2, fib2, sum = 2;
@ -12,7 +20,9 @@ int main(int argc, char **argv)
fib2 = fib0 + fib1;
while(fib2 <= 4000000)
/* Simple brute-force approach: generate every value in the Fibonacci
* sequence smaller than 4 million and if it's even add it to the total.*/
while(fib2 <= N)
{
if(fib2 % 2 == 0)
{

View File

@ -1,20 +1,25 @@
/* The prime factors of 13195 are 5, 7, 13 and 29.
*
* What is the largest prime factor of the number 600851475143?*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "projecteuler.h"
int max_prime_factor(long int num);
long int max_prime_factor(long int num);
int main(int argc, char **argv)
{
int res;
long int res;
long int num = 600851475143;
double elapsed;
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
/* Use a function to calculate the largest prime factor.*/
res = max_prime_factor(num);
clock_gettime(CLOCK_MONOTONIC, &end);
@ -22,41 +27,51 @@ int main(int argc, char **argv)
elapsed = (end.tv_sec - start.tv_sec) + (double)(end.tv_nsec - start.tv_nsec) / 1000000000;
printf("Project Euler, Problem 3\n");
printf("Answer: %d\n", res);
printf("Answer: %ld\n", res);
printf("Elapsed time: %.9lf seconds\n", elapsed);
return 0;
}
int max_prime_factor(long int num)
/* Recursive approach: if num is prime, return num, otherwise
* recursively look for the largest prime factor of num divided
* by its prime factors until only the largest remains.*/
long int max_prime_factor(long int num)
{
int i, limit;
long int i;
/* Use function defined in projecteuler.c to check if a number is prime.*/
if(is_prime(num))
{
return num;
}
/* If num is even, find the largest prime factor of num/2.*/
if(num % 2 == 0)
{
return max_prime_factor(num/2);
}
else
{
limit = floor(sqrt(num));
for(i = 3; i <= limit; i += 2)
i = 3;
while(1)
{
/* If num is divisible by i and i is prime, find largest prime
* factor of num/i.*/
if(num % i == 0)
{
if(is_prime((long int)i))
if(is_prime(i))
{
return max_prime_factor(num/i);
}
}
i += 2;
}
}
/* Should never get here.*/
return -1;
}

View File

@ -1,3 +1,7 @@
/* A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
*
* Find the largest palindrome made from the product of two 3-digit numbers.*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
@ -11,11 +15,15 @@ int main(int argc, char **argv)
clock_gettime(CLOCK_MONOTONIC, &start);
/* Using a brute-force approach: generate every product of 3-digit numbers
* and check if it's palindrome. If the product found is greater than the
* current maximum, save the current product.*/
for(i = 999; i >= 100; i--)
{
for(j = i; j >= 100; j--)
{
num = i * j;
/* Use the function defined in projecteuler.c to check if a number is palindrome.*/
if(num > max && is_palindrome(num, 10))
{
max = num;

View File

@ -1,3 +1,7 @@
/* 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
*
* What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
@ -11,6 +15,7 @@ int main(int argc, char **argv)
clock_gettime(CLOCK_MONOTONIC, &start);
/* Function define in projecteuler.c to find the least common multiple of multiple numbers.*/
res = lcmm(n, 20);
clock_gettime(CLOCK_MONOTONIC, &end);

View File

@ -7,20 +7,29 @@ int partition(void **array, int l, int r, int (*cmp)(void *lv, void *rv));
int is_prime(long int num)
{
int i, limit;
long int i, limit;
if(num <= 3)
{
/* If num is 2 or 3 then it's prime.*/
return num == 2 || num == 3;
}
/* If num is divisible by 2 or 3 then it's not prime.*/
if(num % 2 == 0 || num % 3 == 0)
{
return 0;
}
/* Any number can have only one prime factor greater than its
* square root. If we reach the square root and we haven't found
* any smaller prime factors, then the number is prime.*/
limit = floor(sqrt(num));
/* Every prime other than 2 and 3 is in the form 6k+1 or 6k-1.
* If I check all those value no prime factors of the number
* will be missed. If a factor is found, the number is not prime
* and the function returns 0.*/
for(i = 5; i <= limit; i += 6)
{
if(num % i == 0 || num % (i + 2) == 0)
@ -29,11 +38,42 @@ int is_prime(long int num)
}
}
/* If no factor is found up to the square root of num, num is prime.*/
return 1;
}
int is_palindrome(int num, int base)
{
int reverse = 0, tmp;
tmp = num;
/* Start with reverse=0, get the rightmost digit of the number using
* modulo operation (num modulo base), add it to reverse. Remove the
* rightmost digit dividing num by the base, shift the reverse left
* multiplying by the base, repeat until all digits have been inserted
* in reverse order.*/
while(tmp > 0)
{
reverse *= base;
reverse += tmp % base;
tmp /= base;
}
/* If the reversed number is equal to the original one, then it's palindrome.*/
if(num == reverse)
{
return 1;
}
return 0;
}
long int gcd(long int a, long int b)
{
/* Euclid's algorithm for the greatest common divisor:
* gcd(a, 0) = a
* gcd(a, b) = gcd(b, a modulo b)*/
if(b == 0)
{
return a;
@ -42,16 +82,19 @@ long int gcd(long int a, long int b)
return gcd(b, a%b);
}
/* Least common multiple algorithm using the greatest common divisor.*/
long int lcm(long int a, long int b)
{
return a * b / gcd(a, b);
}
/* Recursive function to calculate the least common multiple of more than 2 numbers.*/
long int lcmm(long int *values, int n)
{
int i;
long int value;
/* If there are only two numbers, use the lcm function to calculate the lcm.*/
if(n == 2)
{
return lcm(values[0], values[1]);
@ -65,6 +108,7 @@ long int lcmm(long int *values, int n)
values[i] = values[i+1];
}
/* Recursively calculate lcm(a, b, c, ..., n) = lcm(a, lcm(b, c, ..., n)).*/
return lcm(value, lcmm(values, n-1));
}
}
@ -207,27 +251,6 @@ void quick_sort(void **array, int l, int r, int (*cmp)(void *lv, void *rv))
quick_sort(array, i+1, r, cmp);
}
int is_palindrome(int num, int base)
{
int reverse = 0, tmp;
tmp = num;
while(tmp > 0)
{
reverse *= base;
reverse += tmp % base;
tmp /= base;
}
if(num == reverse)
{
return 1;
}
return 0;
}
int is_pandigital(int value, int n)
{
int *digits;

View File

@ -2,14 +2,14 @@
#define _PROJECTEULER_INCLUDED
int is_prime(long int);
long int lcmm(long int *values, int n);
long int lcm(long int a, long int b);
int is_palindrome(int num, int base);
long int gcd(long int a, long int b);
long int lcm(long int a, long int b);
long int lcmm(long int *values, int n);
int *sieve(int n);
int count_divisors(int n);
void insertion_sort(void **array, int l, int r, int (*cmp)(void *lv, void *rv));
void quick_sort(void **array, int l, int r, int (*cmp)(void *lv, void *rv));
int is_palindrome(int num, int base);
int is_pandigital(int value, int n);
int is_pentagonal(long int n);

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3
from math import sqrt, floor
from math import sqrt, floor, gcd
from numpy import ndarray, zeros
@ -19,12 +19,6 @@ def is_prime(num):
return True
def gcd(a, b):
if b == 0:
return a
return gcd(b, a%b)
def lcm(a, b):
return a * b // gcd(a, b)