Problem 74 auf projecteuler.net
Nach längerer Zeit endlich mal wieder eine neue Lösung, dieses Mal für das Problem 74
Auf meinem alten Laptop mit einem i3-2350M braucht das Skript nur knapp über eine Sekunde:
gcc -O3 -march=native -mtune=native -std=c11 -ffast-math Problem74.c -lm -o Problem74 && time ./Problem74
Result: 402
real 0m1,196s
user 0m1,196s
sys 0m0,000s
Und der Code dazu:
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 |
#include <stdio.h> #include <math.h> typedef unsigned long ulong; static const ulong faclist[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880}; static inline ulong getDigitFacSum(ulong n) { ulong sum; for(sum = 0; n > 0; sum += faclist[n % 10], n /= 10); return sum; } static ulong getChainLength(ulong n) { ulong checklist[60], count = 1, i; if((*checklist = getDigitFacSum(n)) == n) return count; do { checklist[count] = getDigitFacSum(checklist[count-1]); for(i = 0; i < count; i++) if(checklist[count] == checklist[i]) return ++count; } while(++count < 60); return 0; } int main(void) { ulong c = 0, i; for(i = 1; i < 1000000; i++) if(getChainLength(i) == 60) c++; printf("Result: %lu\n", c); } |
Veröffentlicht am 19. August 2017 von admin in C, Programmierung, projecteuler