2009-07-27 9 views
5

problem:Biorąc pod uwagę łącznie, należy określić, ile razy wartość pójdzie do niego

okno może trzymać 53 przedmiotów. Jeśli dana osoba ma 56 przedmiotów, wymaga dwóch pudełek do ich przechowywania. Ramka 1 odbędzie się 53 pozycji i pole 2 odbędzie 3.

Jak mogę powtórzyć powyższe gdzie 53 jest stały, niezmienny, wartość i 56 jest zmienna dla każdego pola:

Math.Ceiling(Convert.ToDecimal(intFeet/53)) 

co mam tak daleko, że jest:

int TotalItems = 56; 
int Boxes = Math.Ceiling(Convert.ToDecimal(intFeet/53)); 

for (int i = 0; i < Boxes; i++) 
{ 
    int itemsincurrentbox=?? 
} 
+0

Biorąc pod uwagę, że '56' jest liczbą całkowitą _, to nie ma sensu, aby była" zmienną dla każdego pola ". Czy może masz na myśli coś przeciwnego - znasz całkowitą liczbę przedmiotów, ale każde pudełko może pomieścić inną ilość (np. Przechowywane w tablicy)? W przeciwnym razie nie mogę zrozumieć pytania ... –

+0

Czy chcesz wiedzieć, ile potrzebujesz skrzynek, lub ile przedmiotów znajduje się w pudełku? – Jason

Odpowiedz

16

Gdzie całkowitymi capacity i numItems są pojemność skrzynki (53 w przykładzie) oraz całkowitą liczbę elementów trzeba użyć dwóch następujących obliczeń:

int numBoxes = numItems/capacity; 
int remainder = numItems % capacity; 

Ta wola podaje liczbę wypełnianych pól (numBoxes) i liczbę pozycji w dodatkowym polu (remainder), jeśli są potrzebne, ponieważ ta wartość może wynosić 0.

Edytuj: As Luke wskazano w komentarzach, można uzyskać ten sam wynik z funkcją biblioteki klas .NET Math.DivRem.

Ta funkcja zwraca iloraz i umieszcza pozostałą część w parametrze wyjściowym.

+2

także: int pozostały; int numBoxes = Math.DivRem (numItems, capacity, out reszta); –

+0

@Luke: Fancy! Naprawdę potrzebuję więcej programowania .NET, aby zapoznać się ze wspólnymi funkcjami biblioteki. –

+0

To jednak nie jest tak naprawdę potrzebne :) Dobre wyjaśnienie. –

6

proste, zbyt imperatyw przykład:

int itemsPerBox = 53; 
int totalItems = 56; 
int remainder = 0; 
int boxes = Math.DivRem(totalItems, itemsPerBox, out remainder); 
for(int i = 0; i <= boxes; i++){ 
    int itemsincurrentbox = i == boxes ? remainder : itemsPerBox; 
} 
+0

I tęsknię za Perl i jego składnia listy, gdzie mogę zrobić (div, rem) = divRem (totalItems, itemsPerBox); Dlaczego nie mogę uzyskać nowoczesnego, imperatywnego języka do obsługi tej składni? –

+0

Bije mnie ... to wystarczająco trudne, aby uzyskać funkcje jako obiekty pierwszej klasy ... choć myślę, że obsługa krotek byłaby łatwiejsza do wdrożenia. –

+0

@darthcoder - masz na myśli taki jak F #? Lub Python? –

1

Jeśli dobrze rozumiem pytanie, wszystkie pola oprócz ostatniego pola będą zawierały 53 elementy, natomiast ostatnie pole będzie zawierać inteFeet% 53 (intFeet mod 53 lub pozostała część po podziale intFeet i 53).

Pętla nie jest konieczna, aby odpowiedzieć na pytanie;

int totalItems = 56; 
int boxes = Math.Ceiling(Convert.ToDecimal(totalItems/53)) + 1; 
for(int i=0; i< boxes;i++) 
{ 
    int numberInBoxes = i != boxes -1 ? 53 : totalItems % 53; 
} 
+0

niepotrzebne obliczenia w trakcie każdej pętli - nie ma to większego znaczenia dla czasu obliczeń (lub, że ma to znaczenie), ale zmniejsza czytelność i czytelność - nie ma potrzeby wykonywania modu w pętli, jeśli pozostała część zostanie zachowana (patrz mój przykład). Ale tak, większość ludzi zdaje się docierać do tego samego wyniku :) –

+0

Nie powtarzam modułu. czytajcie na potrójnych operatorach – johnc

+1

Mogłem przysiąc, że mod był na LHS kiedy czytam to, moje złe. Myślę, że czytanie jest mniej czytelne, ale jesteś całkowicie poprawny. "Odczytaj na operatorach trójskładnikowych" było trochę złym ukłuciem, ponieważ mój przykład wyraźnie wykorzystuje potrójny, ale wybaczam ci. –

1

spróbuj użyć modułu?

x % y 
+0

Nie widać go na poziomie, gdzie jest jasne, jak go właściwie używać bez odrobiny pomocy. Również symbol modułu w języku C# jest% –

-1

Wszystkie oprócz ostatniego pola będą miały 53 elementy. Jeśli chodzi o obliczanie liczby pełnych pól i liczby pozycji w ostatnim polu, należy sprawdzić całkowitą liczbę całkowitą i moduł.

+0

Jeśli OP chce więcej, prosi mnie, abym tam pracował. – BCS

1

Użyj operatora modulus do określenia pozostałej części. Krótki przykład:

int totalBoxes = Math.Ceiling(Convert.ToDecimal(intFeet/53)); 

List<int> boxes = new List<int>(); 
for (int i=0; i< totalBoxes; i++) 
{ 
    if (i == totalBoxes-1) 
     boxes.Add(intFeet % 53) 
    else 
     boxes.Add(53); 
} 
Powiązane problemy