2009-07-27 20 views
5

El problema:dado un total, determinar el número de veces que un valor va a entrar en ella

Una caja puede contener 53 artículos. Si una persona tiene 56 elementos, se necesitarán 2 cajas para contenerlos. Recuadro 1 llevará a cabo 53 artículos 2 y la caja contendrá 3.

¿Cómo se repita lo de arriba, donde 53 es una constante, inmutable, el valor y 56 es una variable para cada cuadro:

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

lo que tengo hasta ahora para que sea:

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

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

Dado que '56' es un _total_ número de elementos, no tiene sentido que sea una" variable para cada cuadro ". ¿Quizás diga lo contrario? ¿Sabe la cantidad total de elementos, pero cada caja puede contener una cantidad diferente (por ejemplo, almacenada en una matriz)? De lo contrario, no puedo entender la pregunta ... –

+0

¿quieres saber cuántas cajas necesitarás, o cuántos artículos hay en tu caja restante? – Jason

Respuesta

16

Donde los números enteros capacity y numItems son su capacidad de caja (53 en el ejemplo) y el número total de elementos que tiene, utilizan los siguientes dos cálculos:

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

Esta voluntad darle el número de cajas que se llenan (numBoxes) y la cantidad de artículos en una caja adicional (remainder) si es necesario, ya que este valor podría ser 0.

Editar: Como Lucas señalado en los comentarios, puede obtener el mismo resultado con la función de biblioteca de clases .NET Math.DivRem.

int remainder; 
int numBoxes = Math.DivRem(numItems, capacity, out remainder); 

Esta función devuelve el cociente y coloca el resto en un parámetro de salida.

+2

también: resto restante; int numBoxes = Math.DivRem (numItems, capacidad, resto de salida); –

+0

@Luke: ¡Fancy! Realmente necesito hacer más programación .NET para familiarizarme con las funciones comunes de la biblioteca. –

+0

No es que realmente lo necesites :) Buena explicación por cierto. –

6

ejemplo sencillo, excesivamente imperativa:

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

Anhelo Perl y su lista de sintaxis donde puedo hacer (div, rem) = divRem (totalItems, itemsPerBox); ¿Por qué no puedo obtener un lenguaje imperativo moderno para soportar esta sintaxis? –

+0

Me late ... es bastante difícil conseguir funciones como objetos de primera clase ... aunque creo que el soporte de tuplas sería más fácil de implementar. –

+0

@darthcoder - ¿te refieres a uno como F #? ¿O Python? –

1

Si entiendo la pregunta correctamente, todas las casillas excepto la última caja contendrán 53 elementos, mientras que la última casilla contendrá intFeet% 53 (intFeet mod 53, o el resto después de la división de intFeet y 53).

Sin embargo, el ciclo no es necesario para responder a su pregunta;

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

cómputo innecesario durante cada bucle - no es que va a hacer una gran diferencia en el tiempo de cálculo (o que importa), pero disminuye la claridad y la legibilidad - no hay necesidad de realizar la modificación en el bucle si el resto se retiene (ver mi ejemplo). Pero sí, la mayoría de las personas parecen llegar a casi el mismo resultado :) –

+0

No estoy repitiendo el módulo. leer sobre los operadores ternarios – johnc

+1

Podría haber jurado que el mod estaba en el LHS cuando lo leí, mi mal. Creo que es menos limpio para leer, pero estás totalmente en lo correcto. 'Lectura de operadores ternarios' fue un poco una puñalada perversa, ya que mi ejemplo utiliza claramente un ternario, pero te perdono. –

1

prueba usando un módulo?

x % y 
+0

Él claramente no está en el nivel todavía donde está claro cómo usarlo correctamente sin un poco más de ayuda. Además, el símbolo del módulo en C# es% –

-1

Todos menos el último cuadro tendrán 53 elementos. En cuanto a calcular la cantidad de cuadros completos y la cantidad de elementos en la última casilla, busque división y módulo enteros.

+0

Si el OP quiere más que eso, me están pidiendo que trabaje para ellos. – BCS

1

Utilice el operador de módulo para determinar el resto. Ejemplo rápido:

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); 
} 
Cuestiones relacionadas