2010-12-13 3 views
2

Изучение C и мысль о том, что проблемы будут интересным и интересным способом узнать (и убьют двух птиц одним камнем, потому что это заставило бы меня задуматься и о математике), но я «Я попал в ловушку.Как разделить глупо большие числа в C

У меня есть (что я думаю) хороший (если простой) алгоритм для нахождения наибольшего простого множителя числа. Он работает (насколько я его протестировал), но вопрос PE использует 600851475143 как последний вопрос. Я пытался использовать двойники и т. Д., Но я никогда не могу найти как оператора модуляции, так и оператора разделения. Любая помощь будет принята с благодарностью.

код прилагается, прежде чем я начал, чтобы он работал с двойниками (или любого другого типа):

#include<stdio.h> 
#include <math.h> 

void main() { 
    int target, divisor, answer; 
    target = 375; 
    divisor = 2; 
    answer = -1; 

    answer = factorise (target,divisor); 

    printf("Answer to Euler Problem 3: %i\n", answer); 
} 

int factorise(number, divisor) { 
    int div; 
    while (divisor < number) { 
     div = divide(number,divisor); 
     if (div) {number = div;} 
     else {divisor++;} 
    } 
    return divisor; 
} 

int divide(a,b) { 
    if (a%b) {return 0;} 
    else {return a/b;} 
} 
+1

Посмотрите на связанный с этим вопрос: http://stackoverflow.com/questions/1384160/calculating-factorial-of-large-numbers-in-c – nik

+2

'long long long long' – khachik

+0

Ну, длинный длинный будет отлично. 64 бит, около 9 x 10 18. – gnasher729

ответ

4

Вы пробовали long или long long? В зависимости от вашего компилятора они могут работать. Но в конечном итоге вам понадобится библиотека bigint для других проблем с PE. Есть некоторые в Интернете, но, поскольку вы делаете это, чтобы научиться, я предлагаю писать свои собственные.

+0

Я уверен, что мой компилятор не будет делать ничего полезного с длинным или длинным длинным, поэтому кажется, что я буду создавать свою собственную библиотеку bigint! Благодарю. – silentcontributor

+1

", но так как вы делаете это, чтобы научиться, я бы предложил написать свой собственный" ???? Написание правильных математических библиотек любого рода может быть ужасно трудным. Если вы учитесь, это одно, но если вы регулярно пользуетесь, я всегда предпочитаю авторитетную библиотеку, созданную кем-то, кто знает, как это сделать правильно. (И это происходит от тех, кто написал много функций математической библиотеки в свое время) –

+0

@Jason S Оригинальный вопрос для Project Euler, а не для производственного кода. – robert

1

Наибольший целочисленный тип в C99 является long long, вы можете попробовать это.

Вы не можете делать точные интегральные вычисления с double, так как это неточно с большими числами.

+0

Спасибо, что поняли, что вверх - не знали, что парни были неточны! Имейте это в виду! – silentcontributor

+0

Удваивает точность для целых чисел до 52 бит, что много для 600851475143. Долгое время все же лучше, конечно. – xan

+0

До 53 бит (2^53). И да, долго долго. – gnasher729

2

: C стандарт устанавливает нижний предел для целочисленных типов:

char: 127 (2^7 - 1) 
short: 32767 (2^15 - 1) 
int: 32767 (2^15 - 1) 
long: 2147483647 (2^31 - 1) 
long long (C99): 9223372036854775807 (2^63 - 1) 

Если Project Euler использует C99 компилятор вы гарантированно с long long.

Кроме того, это минимум значения. Я думаю, что Project Euler's long s - 64 бит, поэтому long также должен работать для C89.

 Смежные вопросы

  • Нет связанных вопросов^_^