2012-01-19 7 views
10

Есть ли какой-нибудь быстрый способ в C (менее 1 секунды), чтобы найти число идеальных квадратов между двумя числами. Для примера. для 1 < -> 10 у нас есть 2 идеальных квадрата 4 и 9. Но как насчет между 1 < -> 2^60 или некоторым другим большим числом.Идеальные квадраты между двумя номерами

Это медленно

while(i*i<=n) 
{ 
    sum+=i==((long long)(sqrt(i*i))); 
    i++; 
} 

где п позволяет сказать, что 2^60, и мы начинаем с г = 2.

+8

* менее 1 сек * 1 секунду на том, что, 486 или GeForce 560? –

+2

Почему, 2^30 - 1? Вы можете вычислить «sqrt» конечных точек и узнать, сколько целых чисел находится в этом диапазоне? –

ответ

41
x = (int)sqrt(n2) - (int)sqrt(n1); 
+0

Просто исправьте индексирование, чтобы получить мой голос вверх. В [9,10] – amit

+2

есть 1 идеальный квадрат @amit: На его примере (1 <-> 10 с 2) нижний конец является эксклюзивным. –

+0

true. +1 это тогда. – amit

12

Его тривиально. Предположим, у вас есть две конечные точки: & b, с < b.

  1. Какая следующая идеальная площадь после? Подсказка: что такое sqrt (a)? Что бы округлить?

  2. Что представляет собой самый большой идеальный квадрат, который не превышает b? Подсказка: что такое sqrt (b)? Опять же, как бы округлить помощь здесь?

Как только вы знаете эти два числа, подсчет количества идеальных квадратов кажется действительно тривиальным.

Кстати, будьте осторожны. Даже sqrt 2^60 - большое количество, хотя он будет вписываться в двойной. Проблема в том, что 2^60 слишком велика, чтобы вписаться в стандартный двойник, так как она превышает 2^53. Поэтому будьте осторожны с проблемами точности.

+0

+ хороший трюк, спасибо! –

0
if(n1 is a perfect square)  
    x=(int)sqrt(n2)-(int)sqrt(n1)+1; 
else 
    x=(int)sqrt(n2)-(int)sqrt(n1); 
Смежные вопросы