2012-08-23 37 views
8

बेहतर शीर्षक के बारे में सोच नहीं सका। वैसे समस्या यह है: मेरे पास "int i" है, यह कोई मूल्य हो सकता है। मेरा लक्ष्य "int i" को द्वारा विभाजित निकटतम संख्या में बदलने के लिए है।जावा - यह जांचने के लिए कि कोई विभाजन एक पूर्णांक या फ़्लोट है या नहीं?

उदाहरण के लिए, मुझे i = 33 मिला। तो मुझे (16x2) पर बदल दिया जाएगा। लेकिन अगर मुझे i = 50 मिलता है, तो यह (16x3) पर बदल जाएगा।

मैं उदाहरण के लिए बहुत सी बातें करने की कोशिश की:

for (int x = i; x < 999; x++){ 
if ((i - x)/16 *is an integer*){ 
i = i - x; 
} 

लेकिन मैं जानता हूँ कि अगर इसकी एक पूर्णांक जांच करने का तरीका नहीं है। तो हो सकता है कि मेरा पिछला कोड काम हो, लेकिन मुझे यह जांचने का एक तरीका ढूंढना होगा कि यह एक पूर्णांक या फ्लोट है या नहीं। तो .. किसी भी मदद की सराहना की है।

if((i - x)%16 == 0) { 
    // (i-x)/16 is integer 
} 
+4

दो चींटियों का डिवीजन हमेशा एक int परिणाम होगा। आप इसके बजाय मॉड्यूलस ('%') का उपयोग कर सकते हैं। – GriffeyDog

+0

एफडब्ल्यूआईडब्ल्यू, मैं इस समस्या को हल करने के लिए एक अलग दृष्टिकोण की कोशिश करने का सुझाव देना चाहता हूं। 16 से अधिक प्राप्त करने के लिए मैं उस संख्या को देखने के लिए लूपिंग के इस दृष्टिकोण को बहुत अक्षम कर सकता हूं। और क्या होगा यदि 16 का सबसे नज़दीकी एकाधिक मुझसे बड़ा है? – Alex

उत्तर

5

सभी ints के बाद से जो

i &= 0xfffffff0; // Sets i to the greatest multiple of 16 less than i, or 0 for i < 16 

उदाहरण के लिए::

कर रहे हैं 16 से विभाज्य अपने पिछले 4 बिट्स आप पूरा कर सकते हैं एक पाश के बिना आप क्या चाहते हैं या यहां तक ​​कि एक अगर बयान 0. लिए पूरी तरह तैयार होगा
int i = 50; 
i &= 0xfffffff0; // i == 48 

i = 39; 
i &= 0xfffffff0; // i == 32 

i = 16; 
i &= 0xfffffff0; // i == 16 
+0

पूरी तरह से काम करता है! – user1541106

4

(i - x)/16 जब (i - x)/16 के शेष 0. उपयोग% (मापांक) की तरह ऑपरेटर है पूर्णांक है। मॉड आपको एक विभाजन ऑपरेशन का शेष देता है।

public boolean isEvenlyDivisable(int a, int b) { 
    return a % b == 0; 
} 
12

उपयोग आधुनिक ऑपरेटर:

1

पता लगाने के लिए कि क्या एक संख्या समान रूप से एक और विभाजित है, अन्य उत्तर देखें, Modulo (%) तरीका है कि ऐसा करने के लिए है।

public int nearestDivider(final int input) 
{ 
    final int multiple = input/16; // this will divide by 16 and it's integer math, so it loses the decimal 
    return multiple * 16; 
} 

कि वापस आ जाएगी 48 यदि आप इसे अपने उदाहरण की तरह 50 दे:

है कि आप ऊपर क्या करना चाहते करने के लिए, आप एक पाश की जरूरत नहीं है।

तुम सच में चाहते हैं निकटतम तो आप कुछ चल बिन्दु विभाजन

public int nearestDivider(final int input) 
{ 
    final int multiple = Math.round((float) input/16); 
    return multiple * 16; 
} 

अब क्या करना होगा 46 रिटर्न 48, 149 रिटर्न 144 आदि

+0

"निकटतम" की परिभाषा के आधार पर, आपको 16. – Alex

+0

जोड़ना पड़ सकता है, उसके उदाहरण (और कोड) इंगित करते थे, वह निकटतम या उससे कम निकटतम चाहता था ... – xbakesx

+0

हाँ, यह अनुमान लगाने के लिए कठिन है 2 के नमूना आकार से इरादा ... – Alex

4

साथ हड़ताली मुद्दों की एक संख्या हैं आपका मूल कोड:

  1. यदि आप 16 के निकटतम एकाधिक में घूम रहे हैं, तो यह इस प्रकार है कि आपको संभवतः उच्चतम मूल्य को सब्सक्राइब करना पड़ सकता है कार्य 15 है। इसलिए आपके लूप की ऊपरी सीमा 15 से अधिक होनी चाहिए।
  2. जैसा कि अन्य ने ध्यान दिया है कि आप मॉड्यूल ऑपरेटर (%) का उपयोग किसी दिए गए मान से नीचे करने के लिए सटीक मान निर्धारित करने के लिए कर सकते हैं 16 में से निकटतम एकाधिक। यह पूरी तरह से एक लूप की आवश्यकता को हटा देता है।
  3. लेकिन चूंकि 16 की शक्ति 2 है, और चूंकि पूर्णांक 32 अंकों (यानी 32 बिट्स) के साथ बाइनरी संख्या के रूप में दर्शाए जाते हैं, इसलिए आप बिटमैस्क का उपयोग कर अधिक से अधिक मान की गणना कर सकते हैं ताकि 16 से छोटे अंकों में शून्य हो नंबर। जावा में आप इस उद्देश्य के लिए बाइनरी & ऑपरेटर का उपयोग कर सकते हैं: i & 0xfffffff0। यह पिछले 4 अंकों (जो प्रतिनिधित्व करता है: 8-4-2-1) को शून्य कर देगा, जो प्रभावी रूप से आपके नंबर को 16 तक विभाजित निकटतम मूल्य तक ले जाता है।
  4. यदि आपको संख्या का पूर्णांक विभाजन करने की आवश्यकता है और किसी भी शेष को अनदेखा करने के लिए आप इसे 4 बिट्स द्वारा आसानी से स्थानांतरित कर सकते हैं (>>)।
0

आप 16 वर्ष की निकटतम कई की जरूरत है, तो आप दो मामलों की 8. 1. 8 16 हो जाता है अजीब गुणकों से निपटने के लिए है, 24 32 2. 8 0 हो जाता हो जाता है, 24 16 हो जाता है

पहले के लिए:

int j = ((i+8)/16)*16; 

दूसरे मामले में:

int j = ((i+7)/16)*16; 

यदि आप हमेशा नीचे जाना चाहते हैं (यानी। 17 16 हो जाता है, और 15 0 हो जाता है):

int j = (i/16)*16; 

तो आप हमेशा उत्तर प्रदेश पूर्णांक बनाना (क्या नहीं अपने उदाहरण का कहना है) चाहता था, तो आप इस बजाय किया होता:

int j = ((i+15)/16)*16; 
0

आदेश में एक पूर्णांक या अंश में एक यादृच्छिक विभाजन परिणाम आपको निम्न की आवश्यकता है, तो जाँच करने के लिए:

if (n/p == Math.ceil((double) n/(double) p)) { 
    //the division results in an integer. 
} 
else 
{ 
    //the division results in a fraction. 
} 

एक जरूरत गणित:

int n = 9; 
int p = 3; 

if (n % p == 0) { 
    //the division results in an integer. 
} 
else 
{ 
    //the division results in a fraction. 
} 

आप एक विकल्प के रूप ऐसा कर सकते हैं .ceil() और गोल या मंजिल नहीं, क्योंकि एक पूर्णांक विभाजन लगभग मंजिल के बराबर होता है और अंश गोलाकार हो जाएगा और 'पूर्णांक विभाजन' के रूप में दिखाई देगा।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^