2017-01-13 1 views
1

Un exemple va effacer l'idée:diviser un nombre par 5, obtenant le rapport en poids et en l'utilisant pour diviser un autre numéro

nombre A = 12 nombre B = 20

je besoin de diviser A par 5 jusqu'à ce que je ne vais pas moins de 5. Donc, je reçois 3 parties: 5,5 et 2. Maintenant, je dois utiliser ce résultat pour diviser B compte tenu du poids juste calculé. Donc 20 * (5/12), 20 * (5/12), 20 * (2/12) et leur somme de cours doit être exactement égale à B (20 dans notre cas)

Je dois faire ceci sans perdre de précision et en essayant d'avoir le résultat le plus correct possible. Mon exemple utilise int, mais je dois le faire avec des décimales aussi (A pourrait être 12,37 et B pourrait être 20,13 par exemple) Quelqu'un connaît une bibliothèque ou un indice pour le faire?

+0

Donc, juste pour obtenir ce droit (l'exemple est assez confuse - par exemple, ce qui ne « divise A par 5 jusqu'à ce que je ne vais pas moins de 5 » signifie ?): vous voulez une suite de nombres '(a1, a2, ..., an)', tels que tous les éléments sont '<= 5' et' a1/A * B + a2/A * B + ... + an/A * B = B' et 'a1 + a2 + ... + an = A'? De plus: la séquence ne contient-elle que des entiers, ou les doubles sont-ils également valables? – Paul

+0

Avez-vous regardé java BigDecimal et BigInteger? – mba12

+0

Désolé les gars, vous avez raison, la description est mauvaise. Quand je dis que je dois diviser par 5, cela signifie que je peux le faire avec% est égal à 0. Donc si A est 16 -> 5,5,5,1 si A est 6, je reçois 5 et 1, si A est 13 je reçois 5,5 et 3. La séquence peut contenir du double. C'est bon. Mais nous devons faire attention car travailler avec des nombres décimaux est risqué. – darkRevan85

Répondre

1

Eh bien, cette question (au moins la façon dont je le comprends) est assez simple à résoudre:

Ce que nous avons: A et B, qui peut être décimal
Ce que nous voulons: une séquence (a1, a2, ..., an) avec les propriétés suivantes:

  • tout élément de la séquence est inférieure égale 5
  • tous les éléments résumer à A: a1 + a2 + ... + an = A
  • a1/A * B + a2/A * B + ... + an/A * B = B

temps bien un peu de maths:

B = //RHS => LHS 
a1/A * B + a2/A * B + ... + an/A * B = //factorize 
(a1 + a2 + ... + an)/A * B = //(a1 + a2 + ... + an) = A 
B 

Ou en d'autres termes: quelle que soit l'utilisation séquence que vous voulez. Tant que les éléments de la séquence totalisent A et sont tous plus petits-égaux à B vous allez bien.

En ce qui concerne la précision:
L'utilisation du type de l'entrée il ne devrait pas y avoir de problème avec précision, comme la sortie peut être construit de manière à ne consister en nombres entiers et la partie décimale de l'entrée (donc en fait, votre sortie pourrait avoir une meilleure précision - inutilisée - que l'entrée).

Donc, pour générer les valeurs a1/A * B, a2/A * B, ... que nous devons faire ce qui suit:
Utilisez BigDecimal pour précision maximale - méfiez-vous si, comme B/A peut être périodique! Le reste fonctionne de la manière habituelle, sauf que vous devez utiliser des méthodes à la place des opérateurs normaux:

  • a + b avec BigDecimal serait a.add(b)
  • a * b avec BigDecimal serait a.multiply(b)
  • ...

Vous pouvez rechercher les détails dans documentation.

+0

Merci pour votre réponse Paul. J'ai besoin exactement de ces valeurs: 20 * (5/12), 20 * (5/12), 20 * (2/12), donc avec votre algorithme comment je peux les obtenir? – darkRevan85

+0

@ darkRevan85 Vous voulez dire que vous voulez les valeurs créées en multipliant les éléments de la séquence par 'A/B'? Eh bien, le problème principal, que j'ai déjà montré dans ma réponse, c'est qu'il n'y a pas de façon distincte de diviser 'A'. En fait, il y a un nombre infini de façons. Exemple: pour 'A = 10', vous pouvez utiliser la séquence' (5, 5) 'ou' (5, 5, 5, 5, 5, -15) 'ou' (3.33, 3.33, 3.33) '. Donc, vous devrez d'abord décider comment vous obtiendrez cette séquence d'une manière distincte. – Paul

+0

La séquence doit être comme je l'ai dit. Je dois diviser par 5. Seule la séquence (5,5) est correcte dans votre exemple. Si j'avais 11.77, la séquence doit être 5,5,1.77 – darkRevan85

0

après avoir lu votre question, je ne peux pas comprendre ce que vous voulez. Voulez-vous la séquence de 5,5,5, ..n (où n < 5) pour A ou B, et aussi la chose à propos de la somme pour B est-ce une condition ou est-ce que vous essayez d'atteindre?

de toute façon si elle la séquence que vous voulez, alors vous pouvez le faire:

int A,B;   //if A=12 
int numOfFives=A/5; // then numOfFives=2 
int remainder=A%5; //then remainder=2 

en utilisant cette méthode fera en sorte que le dernier numéro sera toujours inférieur à un.

pour que vous puissiez faire la somme comme:

sum=0; 
for(int i=0;i<numOfFives;i++){ 
sum+=B*(5d/12d); // 5/12 with sum as int gives result sum =0 , so change the fraction part accordingly to your need. 
} 
sum+=B*(remainder/12d); 

si vous voulez la séquence puis faites:

System.out.println("Sequence = "); 
for(int i=0;i<numOfFives;i++){ 
System.out.println(5+","); 
} 
System.out.println(remainder); 

font également votre calulation de séquence beaucoup plus facile.

Modifier 1

ici est le Live Program on IdeOne si vous voulez vérifier.

inputs : 
A=12 
B=20 

outputs: 
Final Sum=20.0 
Sequence=5,5,2 
+0

Merci pour votre réponse. C'est bien, mais je dois supporter les nombres décimaux. (A et B) – darkRevan85

+0

le '5d/12d' donne une réponse en double qui a des décimales jusqu'à 15 chiffres que vous voulez plus? pour le support décimal, tout ce que vous avez à faire est d'initialiser 'A',' B', 'sum' avec le type' double' – anotherGatsby

0

Essayez cet exemple:

import java.math.BigDecimal; 
import java.math.RoundingMode; 

public class Example { 

    public static void main (String[]args) { 
     BigDecimal a = new BigDecimal("16.3");  
     BigDecimal b = new BigDecimal("20"); 
     BigDecimal[] div_rem = a.divideAndRemainder(new BigDecimal("5")); 
     String s = ""; 
     for (int i = 0; i<div_rem[0].intValue();i++){ 
      s += b +" * (5/"+a+"), "; 
     } 
     s += b +" * ("+div_rem[1]+"/"+a+")"; 
     System.out.println(s); 

     System.out.println(b +" * (5/"+a+") = " + b.multiply(new BigDecimal("5").divide(a, 5,RoundingMode.HALF_UP))); 
     System.out.println(b +" * ("+div_rem[1]+"/"+a+") = " + b.multiply(div_rem[1].divide(a,5 ,RoundingMode.HALF_UP))); 
    }    
}