3-я задача проекта Эйлера - C (СИ)
Формулировка задачи:
#include <stdio.h> #include <stdlib.h> int main() { int result; unsigned long delimoe; int delitel; delimoe = 600851475143; //delimoe = 13195; delitel = 3; for (delitel;delitel <= delimoe+1;delitel++) { if ( ( delimoe%delitel==0) &&(!(delitel%2==0)) &&(!(delitel%3==0)) &&(!(delitel%5==0)) ) { result = delimoe%delitel; printf("%d\t%d\n", delitel, result); } } system("PAUSE"); return 0; }
___
85 835 925 020,43 17___
35 344 204 420,18 47___
12 784 073 939,21 119___
5 049 172 060,03 329___
1 826 296 277,03 799___
752 004 349,37 5 593___
107 429 192,77 688 543___
872 641,90 4 819 801___
124 663,13 11 705 231___
51 331,88 32 361 521___
18 566,85 81 936 617___
7 333,13 226 530 647___
2 652,41 550 145 857___
1 092,17 Правильный ответ методом подбора в экселе: 71___
8 462 696 833,00 Вопрос: чё не так?Решение задачи: «3-я задача проекта Эйлера»
long long maxprime(long long l, long long m) { long long d; if (l<3) return l; if (l%2==0) return maxprime(l/2, 2); for (d=m ; d*d<=l; d+=2 ) if (l%d==0) return maxprime(l/d, d); return l; } int main() { printf("%d\n",maxprime(600851475143,3)); return 0; }
Объяснение кода листинга программы
В данном коде реализована функция maxprime
, которая находит наибольший простой делитель числа l
при условии, что m
— это делитель l
. Если число l
меньше 3, то функция возвращает его как простое. В противном случае, если число l
делится на 2, то функция рекурсивно вызывает саму себя для чисел l/2
и 2. Затем функция проверяет все четные числа в диапазоне от m
до квадратного корня из l
, и если число l
делится на какое-либо из этих чисел без остатка, то функция рекурсивно вызывает саму себя для чисел l/d
и d
. Если такое число не найдено, то функция возвращает l
.
В функции main
вызывается функция maxprime
с аргументами 600851475143 и 3, и результат выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д