2012-01-19 13 views
10

क्या दो संख्याओं के बीच सही वर्गों की संख्या को खोजने के लिए सी (नीचे 1 सेकंड) में कोई तेज़ तरीका है। पूर्व के लिए । 1 < -> 10 के लिए हमारे पास 2 सही वर्ग 4 और 9 हैं। लेकिन 1 < -> 2^60 या कुछ अन्य बड़ी संख्या के बीच क्या है।दो संख्याओं के बीच सही वर्ग

यह धीमी है

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

जहां n है की सुविधा देता है का कहना है कि 2^60 और हम मैं के साथ शुरू = 2।

+8

*, एक 486 या एक GeForce 560? –

+2

क्यों, 2^30 - 1? क्या आप एंडपॉइंट्स के 'sqrt' की गणना कर सकते हैं और यह पता लगा सकते हैं कि उस सीमा में कितने पूर्णांक संख्याएं हैं? –

उत्तर

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

बस अपना वोट प्राप्त करने के लिए इंडेक्सिंग को ठीक करें: [9, 10] – amit

+2

@amit में 1 सही वर्ग है: उसके उदाहरण (1 <-> 10 होने 2), निचला अंत अनन्य है। –

+0

सच। +1 तब है। – amit

12

इसकी तुच्छ। मान लें कि आपके पास दो एंडपॉइंट्स हैं, & बी, < बी के साथ।

  1. एक के बाद अगला सही वर्ग क्या है? संकेत, एसक्यूआरटी (ए) क्या है? क्या करना होगा?

  2. बी से अधिक नहीं होने वाला सबसे बड़ा सही वर्ग क्या है? संकेत, एसक्यूआरटी (बी) क्या है? फिर, गोल करने में मदद कैसे होगी?

एक बार जब आप उन दो संख्याओं को जानते हैं, तो सही वर्गों की संख्या की गणना करना वास्तव में तुच्छ लगता है।

वैसे, सावधान रहें। यहां तक ​​कि 2^60 का वर्ग बड़ा नंबर है, हालांकि यह एक डबल में फिट होगा। समस्या यह है कि मानक^2 में फिट होने के लिए 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); 
5

पुनरावृत्त मत करो। समीकरण:

floor(sqrt(b)) - ceil(sqrt(a)) + 1 

b समावेशी अप करने के लिए a से अंतराल में सही वर्गों की संख्या देता है।

https://en.wikipedia.org/wiki/Intermediate_value_theorem

नीचे क्या पर 1 सेकंड * 1 सेकंड
संबंधित मुद्दे