2015-09-26 2 views
0

У меня уже есть код, где я вычислить количество совершенных квадратов между 1 и максимальным диапазоном:Рассчитайте количество совершенных квадратов в заданном большом диапазоне в C

int perfectCounter = 0; 
int i = 1; 
int maxRange; 

scanf("%d", &maxRange); 

while (i <= maxRange) { 
    float tempSquare = sqrt(i); 
    int integerPart = tempSquare; 

    if (tempSquare == integerPart) 
     perfectCounter++; 
} 

Проблема заключается в том, что диапазон макс должен быть между 1 и 10^1000, поэтому я не могу сохранить этот maxRange в int, длинном или длинном двойном. Я не могу придумать решение для этого, не используя внешние библиотеки, которые обрабатывают очень большие числа.

+0

И почему вы хотите рассчитать количество идеальных квадратов от 1 до 10^1000? – intboolstring

+0

вам нужна квантовая рабочая станция, но чтобы облегчить то, как я советую вам идти вперёд, означает «квадрат», не root. и когда число появляется, чтобы оставить границы, используйте modulo. – Abra001

ответ

2

Если вам просто нужно кол сколько совершенных квадратов есть между 1..N все, что вам нужно сделать, это: взять квадратный корень из N и получить его целочисленное значение :)

Вдумайтесь Это. Для диапазона 1..10 правильный ответ 3 (1, 4, 9), который, кстати, округленный sqrt(10). Если вы не хотите считать 1 идеальной площадью - отлично, просто не рассчитывайте.

И вообще, чтобы увидеть, сколько «идеальных квадратов» есть в диапазоне M..N все, что вам нужно сделать, это:

(int)sqrt(N) - (int)sqrt(M) - 1 

Это должно быть достаточно просто, потому что все, что вам нужно сделать сейчас, это получить квадрат корень «очень большого числа». Чтобы вам нужно было написать функцию, true. Но это не слишком сложно, и в Интернете есть множество ресурсов, которые могут помочь вам в этом.

1

Если вы не хотите использовать внешние библиотеки, я предлагаю вам найти способ хранения ваших чисел в массиве unsigned int. Вы должны написать свои собственные арифметические функции.

В противном случае существует The GNU MP Bignum Library.

2
  • Число совершенных квадратов между любым диапазоном осуществляется без bruteforcing

  • В вашем случае, квадратный корень из 10^1000 является 10^(1000/2) = 10^500. что означает 10^500 совершенные квадраты.

  • для любого другого диапазона, попробуйте сузить его столько, сколько вы можете использовать арифметику, а затем использовать modulo для хранения разумных значений в регистре int32.

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