2012-07-02 6 views
5

इस उदाहरण में विभाजित संख्या? इन समूहों को लगभग एक ही आकार होना चाहिए।बराबर आकार समूहों

उदाहरण के लिए: राशि = 45; maxPerGroup = 15; राशि समूह = 3;

परिणाम: 15 15 15

मैं भाषा के रूप में सी # का उपयोग कर रहा हूँ।

अग्रिम धन्यवाद!

+0

आप अंकगणितीय विभाजन ऑपरेटर के लिए देख रहे उचित कोड पाया है? –

+0

यह होमवर्क है? –

+0

नहीं, यह होमवर्क नहीं है। मैं इसे पूरे दिन देख रहा हूं। –

उत्तर

1

नोट सटीक नहीं ग # केवल आपके विचार देने के लिए।

मुझे लगता है कि आप विभिन्न समूहों में व्याकरणिक रूप से एक संख्या को विभाजित करने का एक तरीका ढूंढ रहे हैं। यह जानने के बिना कि समूह कितने बड़े हैं और समूह की एक यादृच्छिक राशि है।

तो मान लें कि x = 30 y = 15. 30/15 = 15 के 15 समूह और मान लें x = 43 तो संख्या कैसा होना चाहिए? 14 14 15

groups (since you already have this calculated correctly)(should be a double) 
// maxPerGroup = y 
membersPerGroup = floor(amount/groups) 



List a = new List 
//Is the leftover value of the modulus 
leftover = amount%groups; 
//Loops for each group 
for(int i=0;i<groups;i++){ 


//If there is a left over value 
if(leftover>0){ 
    a.Add(membersPerGroup +1); 
    leftover--; 
}else{ 
    a.Add(membersPerGroup); 
} 

} 

मैं उचित सी # में लिख सकता है लेकिन ऐसा नहीं है कि आप के लिए यह

+1

जैसा कि मैंने अपनी टिप्पणी (प्रश्न) में संकेत देने की कोशिश की - समूहों की संख्या सही ढंग से गणना नहीं की जाती है, एक पूर्णांक द्वारा पूर्णांक को विभाजित करने के परिणामस्वरूप एक पूर्णांक (सी #) होगा। उदाहरण के लिए 31 15 रिटर्न 2 और छत से विभाजित है जो आपको कहीं भी नहीं ले जाएगा .... –

+0

यह एक डबल होना चाहिए। हो सकता है कि मैं इसे लिखने से चूक गया, तो असली सी # कोड नहीं। लेकिन यह एक दोगुना होना चाहिए और मुझे लगता है कि वह – Liquid

+0

का उल्लेख करता है और फिर से पढ़कर मैं कुछ और गलतियों को झुकाता हूं – Liquid

3
number of groups := ceiling(total/max group size) 
number per group := floor(total/number of groups) 
rem = total % number per group 

आप number per group साथ number per group + 1 और number of groups - rem समूहों के साथ rem समूहों होगा।

संपादित करें: उदाहरण: 13 के साथ

total := 50 
max group size := 15 
number of groups := ceiling(50/15) // 4 
number per group := floor(50/4) // 12 
rem := 50 % 12 // 2 

2 समूहों और 12.

+1

यह मेरे कोड से स्पष्ट होना चाहिए कि स्लेश उचित विभाजन का प्रतिनिधित्व करते हैं, पूर्णांक विभाजन नहीं (अन्यथा फर्श और छत के संचालन अर्थहीन होंगे)। इसके अलावा, किसी भी विशेष डेटाटाइप का उपयोग एक कार्यान्वयन विस्तार है। –

1

सरल गैर अनुकूलित समाधान के साथ 2:

int i = amount; 
int j = 0; 
int [] groups = new int[amountGroups]; 
while(i > 0) { 
    groups[j] += 1; 
    i--; 
    j = (j+1)%amountGroups; 
} 
-2
int amount = x; 
int maxPerGroup = y; 
int amountGroups = new int[Ceiling(amount/maxPerGroup)]; 
for(int i=0; i<maxPerGroup; i++) 
{ 
    if(x>maxPerGroup) 
    { 
     amountGroups[i]= maxPerGroup; 
     x = x-maxPerGroup; 
    } 
    else 
    { 
     amountGroups[i] = x; 
     x =0; 
    } 
} 
+0

क्या यह आपको 31 के मामले में 15 15 1 नहीं देगा? – Liquid

0

बंटवारे के कई तरीके हैं समूहों के बीच की राशि। यह सब इस बात पर निर्भर करता है कि केवल कारक समूह की संख्या है या यदि कोई अन्य कारक हैं। देखें:

static void Main(string[] args) 
    { 
     List<int> list1 = Split1(48, 15); // result is: 15, 15, 15, 3 
     List<int> list2 = Split2(48, 15); // result is 12, 12, 12, 12 
    } 

    public static List<int> Split1 (int amount, int maxPerGroup) 
    { 
     int amountGroups = amount/maxPerGroup; 

     if (amountGroups * maxPerGroup < amount) 
     { 
      amountGroups++; 
     } 

     List<int> result = new List<int>(); 
     for (int i = 0; i < amountGroups; i++) 
     { 
      result.Add(Math.Min(maxPerGroup, amount)); 
      amount -= Math.Min(maxPerGroup, amount); 
     } 
     return result; 
    } 

    public static List<int> Split2 (int amount, int maxPerGroup) 
    { 
     int amountGroups = amount/maxPerGroup; 

     if (amountGroups * maxPerGroup < amount) 
     { 
      amountGroups++; 
     } 

     int groupsLeft = amountGroups; 
     List<int> result = new List<int>(); 
     while (amount > 0) 
     { 
      int nextGroupValue = amount/groupsLeft; 
      if (nextGroupValue * groupsLeft < amount) 
      { 
       nextGroupValue++; 
      } 
      result.Add(nextGroupValue); 
      groupsLeft--; 
      amount -= nextGroupValue; 
     } 
     return result; 
    } 
0
// For separating a collection into ranges 
    static List<List<T>> Split<T>(List<T> source, int size) 
    { 
     // TODO: Prepopulate with the right capacity 
     List<List<T>> ret = new List<List<T>>(); 
     for (int i = 0; i < source.Count; i += size) 
     { 
      ret.Add(source.GetRange(i, Math.Min(size, source.Count - i))); 
     } 
     return ret; 
    } 

    // For separating an int into a Tuple range 
    static List<Tuple<int, int>> Split(int source, int size) 
    { 
     var ret = new List<Tuple<int, int>>(); 
     for (int i = 0; i < source; i += size) 
     { 
      ret.Add(new Tuple<int, int>(i, (i + Math.Min(size, source - i)))); 
     } 
     return ret; 
    } 
संबंधित मुद्दे