-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathpalindrome_of_numbers.c
78 lines (66 loc) · 1.69 KB
/
palindrome_of_numbers.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
* Largest palindrome product.
* https://projecteuler.net/problem=4
*/
#include <stdbool.h>
#include <assert.h>
/**
* Check if a number is palindrome.
*
* @param unsigned long long num
*
* @return bool
*/
bool is_palindrome(unsigned long long num)
{
int digit;
unsigned long long n = num;
unsigned long long reverse = 0;
while (n > 0) {
digit = (int) (n % 10);
reverse = reverse * 10 + digit;
n /= 10;
}
return num == reverse;
}
/**
* Find largest palindrome made from the product
* of two n-digit numbers.
*
* @param int digit
*
* @return unsigned long long
*/
unsigned long long largest_palindrome(int digit)
{
int first_digit = digit / 10;
unsigned long long multiple = 0;
unsigned long long largest = 0;
for (int i = digit - 1; i >= first_digit; i--) {
for (int j = digit - 1; j >= i; j--) {
multiple = (unsigned long long) i * j;
if (multiple < largest) {
break;
}
if (is_palindrome(multiple)) {
largest = multiple;
}
}
}
return largest;
}
int main(void)
{
unsigned long long palindromes[] = {0, 11, 121, 10201, 9009, 12321};
unsigned long long non_palindromes[] = {12, 123, 11210, 9109, 12345};
for (int i = 0; i < 6; i++) {
assert(is_palindrome(palindromes[i]));
assert(is_palindrome(non_palindromes[i]) == false);
}
assert(9009 == largest_palindrome(100));
assert(222222 == largest_palindrome(500));
assert(906609 == largest_palindrome(1000));
assert(99000099 == largest_palindrome(10000));
assert(9966006699 == largest_palindrome(100000));
return 0;
}