1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| <html lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1>Liste des éléments d'un tableau dont la somme est un nombre donné</h1><br />
<script>
const tabDatas = [100, 200, 125, 150, 175, 200, 250];
const search = 550.0;
/**
* @param {Array|number]} datas - tableau des données numérique
* @param {number} value - valeur de la somme à trouver
* @return {object} Array des données trouvées
*/
function searchOccurrence(datas, ref) {
// on travaille sur des valeurs entières
// pour éviter les soucis d'arrondi
const MULTI = 100;
datas = datas.map((val) => val * MULTI);
ref = ref * MULTI;
const nbr = datas.length;
const ret = [];
const nbrCas = 1 << nbr; // 2^n cas possibles soit au total (2^n)*n traitements
// pour toutes les combinaisons possibles
for (let i = 0; i < nbrCas; i += 1) {
// récupération de la combinaison
// ex : ["0", "1", "0", "1", "0"] pour la valeur 10
// ["1", "1", "1", "0", "0"] pour la valeur 28
const etats = i.toString(2).padStart(nbr, "0").split("");
const values = [];
let somme = 0;
// on traite chaque cas
etats.forEach((etat, ind) => {
if (etat * 1) {
const val = (+etat * datas[ind]);
somme += val;
values[values.length] = val;
}
});
// store les infos
if( somme == ref){
ret[ret.length] = {
"values" : values.map((val) => (val / MULTI).toFixed(2)),
"somme": (somme / MULTI).toFixed(2)
};
}
}
// tri croissant suivant somme ça peut servir
ret.sort((a, b) => a.somme - b.somme);
return ret;
}
function writeResult(datas) {
const ret = ["Solution(s) :"];
datas.forEach((data) => {
ret[ret.length] = data.values.join(" + ") + " = " + data.somme;
})
console.log(ret.join("\n"));
}
writeResult(searchOccurrence(tabDatas, search));
</script>
</body>
</html> |
Partager