Newsgroup: it.comp.aiuto
Titolo: calcolo, formula, etc etc

Ciao a tutti, volevo sapere se esiste un modo (in exl o con qualche
programma) che da un gruppo di numeri trovi la corrispondente somma
conosciuta. 
ES.     se ho i seguenti numeri 3, 50, 60, 42 e conoscendo la somma di
alcuni di loro 43, vorrei sapere quali sono i numeri da sommare (3+42) 
:-( chissa se avete capito qlc!!!
Vabbe’ io ci ho provato, buon lavoro a tutti. 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 :-( chissa se avete capito qlc!!!
:-/ ? no

 :-/ ? no
Provo a rispiegarmi.
Ho una serie di numeri
40
42
85,5
65,8
70
12
79
io so che alcuni di questi numeri danno un risultato di 97,50
domanda: quali sono i numeri  da sommare che danno questo risultato?
Risposta: 85,5 + 12
Questa e’ la risposta che vorrei avere dal programma!
Ciao!


 Questa e' la risposta che vorrei avere dal programma!
adesso ho capito.....se trovo qualcosa ti rispondo su ng.
ciao

 alcuni di loro 43, vorrei sapere quali sono i numeri da sommare (3+42)
infatti... 3+42=45... :-P
no, non ne sono a conoscenza
--
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.449 / Virus Database: 251 - Release Date: 27/01/2003

 Ciao!
Devi farti un programmino. Sicuramente puoi farlo in VB o in VBA, forse
anche con una macro di Excel. il tutto ovviamente se la risposta è univoca.
Poichè il programma dovrà provare innumerevoli combinazioni, l'esecuzione
potrebbe risultare lenta se l'insieme di numeri è grande. Se domani non ho
troppo da fare provo a fartelo. il valore che cerchi risulta da dalla somma
di soli due numeri o potrebbero essere anche di più?
Una curiosità...ma cosa te ne fai?

Risposta: 85,5 + 12
Questo e' un JavaScript che dovrebbe risolvere il tuo problema, non in
modo efficiente visto che usa il backtracking ricorsivo e non
iterativo, ma la mia pigrizia non mi permette di convertirlo!
Copia il testo seguente e salvalo su un file con estensione HTML, poi
aprilo con il browser (provato con Opera msie mode, e Internet
Explorer).
<!-- INIZIO FILE -->
<HTML>
<body>
<H4>
Benvenuti nello script "Somma combinatoria" - by Sephiroth
</H4>
Questo script prende in input
righe di sequenze di numeri separati da spazi, e un intero
"somma". Per ogni sequenza si calcola una combinazione
lineare della sequenza con scalari 0 o 1 (insieme {0,1}).
Se il risultato della combinazione e' pari a "somma",
viene stampata la sequenza dei numeri della combinazione
con scalari non nulli.<BR>
In pratica, presa una sequenza di n numeri, si trovano
tutti i k&lt;n numeri tali che il loro totale faccia
"somma"; questo per ogni riga.
<BR><BR>
Immetti i numeri separati da spazi:<BR>
<textarea name="txtNumeri" id="txtNumeri" cols="30" rows="20">
</textarea><BR>
Immetti la somma totale:<BR>
<input type="text" name="txtSomma" id="txtSomma"><BR>
<script type="text/javascript">
<!--
function stampaCombinazione(strNum) {
	output.value += strNum + "\n";
}
function calcola(parziale, numInd, numeri, strNum, somma) {
	parziale += parseInt(numeri[numInd]);
	if (parziale == somma) {
		//La prossima si puo' modificare cosi' per non
		//aggiungere "= somma"
		//strNum += numeri[numInd];
		strNum += numeri[numInd] + " = " + parziale;
		stampaCombinazione(strNum);
	}
	else if (parziale < somma && numInd < numeri.length-1) {
		strNum += numeri[numInd] + " + ";
		for (numInd++;numInd < numeri.length;numInd++)
			calcola(parziale, numInd, numeri, strNum,
somma);
	}
}
function parseLine(line) {
   var parziale = 0;
	var numInd = 0;
	var numeri = line.split(" ");
	var strNum = "";
	var somma = parseInt(txtSomma.value);
	if (0<numeri.length)
		for (var numInd=0;numInd < numeri.length;numInd++)
			calcola(parziale, numInd, numeri, strNum,
somma);
}
function trova() {
	var lines = (String(txtNumeri.value)).split("\r\n");
	for (var i=0;i<lines.length;i++) {
		var line = String(lines[i]);
		line = line.replace(/^ +/, "");
		line = line.replace(/ +$/, "");
		line = line.replace(/ {2,}/g, " ");
		if (!(line=="\r\n")) parseLine(line);
	}
}
// -->
</script>
Premi il bottone Calcola! per trovare quali numeri immessi
danno la somma specificata.<BR>
<input type="button" value="Calcola!" onclick="trova()">
<BR><BR>
Combinazioni trovate:<BR>
<textarea name="output" id="output" cols="40" rows="5">
</textarea>
</body>
</HTML>
<!-- FINE FILE -->
-- 
        Sephiroth
____________________________
Linux Registered User:181013
"Computers are like air conditionners, they stop
working properly when you open windows."

 all'equipaggio di it.comp.aiuto: > Questo e' un JavaScript che dovrebbe risolvere il tuo problema cut cut... > Copia il testo seguente e salvalo su un file con estensione HTML, poi > aprilo con il browser (provato con Opera msie mode, e Internet > Explorer). Ciao e grazie della risposta che penso possa fare al caso mio. Ma ti devo segnalare che ci deve essere qualche errore, perche' dopo aver eseguito le tue istruzioni ed aperto il file con estenzione html con I.E., il programma sembra non funzionare bene. Infatti escono delle scritte illeggibili, oltre a quanche finestra di dialogo, e il I.E. quando cerco di eseguire il calcolo, mi da errore di esecuzione. Spero possa risolvere il problema, ti saluto e grazie ancora. P.S. ti incollo cio' che vedo con I.E. oltre delle finestre di inserimento dati che penso qui non escano. Root Entry WordDocument CompObj Normal Default Paragraph Font Documento Microsoft Word 6.0 MSWordDoc qame="txtSomma" id="txtSomma"> Premi il bottone Calcola! per trovare quali numeri immessi danno la somma specificata. Combinazioni trovate: Times New Roman Symbol Arial Times New Roman Times New Roman  Benvenuti nello script "Somma combinatoria" - by Sephiroth  Questo script prende in input righe di sequenze di numeri separati da spazi, e un intero "somma". Per ogni sequenza si calcola una combinazione lineare della sequenza con scalari 0 o 1 (insieme {0,1}). Se il risultato della combinazione e' pari a "somma", viene stampata la sequenza dei numeri della combinazione con scalari non nulli. In pratica, presa una sequenza di n numeri, si trovano tutti i k<n numeri tali che il loro totale faccia "somma"; questo per ogni riga.  Immetti i numeri separati da spazi: Immetti la somma totale: Premi il bottone Calcola! per trovare quali numeri immessi danno la somma specificata. Combinazioni trovate: }xsnid_Z ]  R |  / O s  }xsnid_Z ]  B K e  questo articolo e` stato inviato via web dal servizio gratuito  
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
 

MSWordDocô9ēqame="txtSomma" id="txtSomma">
MS Word 6!?!?
Questa non e' roba che ho scritto tutto io.
Ho copiato pari pari il testo dal mio post e l'ho incollato su un file
HTML. Aperto con Opera su linux, va bene a parte la lentezza, e poi la
modifica per renderlo compatibile con i tasti Invio su linux. Quindi
il problema e' nel tuo lettore news, oppure il programma con cui hai
salvato il file!
-- 
        Sephiroth
____________________________
Linux Registered User:181013
www.chiocciola.it/SW/agent-italiano.html
Disponibili Agent e Free Agent in versione italiana

 Disponibili Agent e Free Agent in versione italiana
Ho provato con un altro pc salvandolo in un documento di word e cambiando
l'estenzione in html (forse sbaglio!) cmq adesso anche se escono sempre
delle scritte "codificate" riesco a far fare dei calcoli anche con
decimali, ma cosa strana non mi somma alcune combinazioni. Potresti
gentilmente verificare se ti somma i seguenti numeri? (185.93 58.26) a me
non trova la corrispondente somma anche con i soli due numeri. Grazie per
la disponibilita', buon lavoro.
-- 


 segnalare che ci deve essere qualche errore, perche' dopo aver eseguito le
[MAXICUT]
Lo script di  Sephiroth va  benissimo, forse ti sarai  incasinato. Copia
tutto il  codice (qui sotto) in Notepad e salvalo  con NOME_CHE_VUOI.htm
Scusami Sephiroth se l'ho un po' modificato. ;-)
Codice da copiare:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-15">
<META content="MSHTML 6.00.2800.1126" name=GENERATOR>
<STYLE></STYLE>
<SCRIPT type=text/javascript>
<!--
function stampaCombinazione(strNum) {
uno.output.value += strNum + "\n";
}
function calcola(parziale, numInd, numeri, strNum, somma) {
parziale += parseInt(numeri[numInd]);
if (parziale == somma) {
//La prossima si puo' modificare cosi' per non aggiungere "= somma"
//strNum += numeri[numInd];
strNum += numeri[numInd] + " = " + parziale;
stampaCombinazione(strNum);
}
else if (parziale < somma && numInd < numeri.length-1) {
strNum += numeri[numInd] + " + ";
for (numInd++;numInd < numeri.length;numInd++)
calcola(parziale, numInd, numeri, strNum,somma);
}
}
function parseLine(line) {
   var parziale = 0;
var numInd = 0;
var numeri = line.split(" ");
var strNum = "";
var somma = parseInt(uno.txtSomma.value);
if (0<numeri.length)
for (var numInd=0;numInd < numeri.length;numInd++)
calcola(parziale, numInd, numeri, strNum,somma);
}
function trova() {
var lines = (String(uno.txtNumeri.value)).split("\r\n");
for (var i=0;i<lines.length;i++) {
var line = String(lines[i]);
line = line.replace(/^ +/, "");
line = line.replace(/ +$/, "");
line = line.replace(/ {2,}/g, " ");
if (!(line=="\r\n")) parseLine(line);
}
}
// -->
</SCRIPT>
</HEAD>
<BODY bgColor=#e0f0ff>
<FORM name=uno>
<TABLE border=0>
  <TBODY>
  <TR>
    <TD style="TEXT-ALIGN: justify" colSpan=2>
<FONT face=Verdana 
      size=3><STRONG><DIV align=center><U>Benvenuti nello script "Somma combinatoria" - by Sephiroth</U></DIV></FONT><BR><FONT face=Verdana 
      size=2>Questo script prende in input righe di sequenze di numeri 
      separati da spazi, e un intero "somma". Per ogni sequenza si calcola una 
      combinazione lineare della sequenza con scalari 0 o 1 (insieme {0,1}). Se 
      il risultato della combinazione e' pari a "somma", viene stampata la 
      sequenza dei numeri della combinazione con scalari non nulli. In pratica, 
      presa una sequenza di n numeri, si trovano tutti i k&lt;n numeri tali che 
      il loro totale faccia "somma"; questo per ogni riga.</STRONG></FONT></TD></TR>
  <TR>
    <TD align=justify colSpan=2>
      <HR><BR><BR>
    </TD>
  <TR>
    <TD align=middle><FONT face=Verdana size=2><STRONG><TEXTAREA id=txtNumeri name=txtNumeri rows=10 cols=30></TEXTAREA><BR>Scrivi 
      i numeri separati da spazi</STRONG></FONT></TD>
    <TD align=middle><FONT face=Verdana size=2><STRONG><TEXTAREA id=output name=output rows=5 cols=40></TEXTAREA><BR>Combinazioni 
      trovate</STRONG></FONT><BR><BR><BR><INPUT type=reset value="Cancella tutto"></TD></TR>
  <TR>
    <TD align=middle>
      <DIV><FONT face=Verdana size=2><STRONG></DIV><FONT face=Verdana 
      size=2><STRONG></STRONG></FONT><BR><BR><INPUT id=txtSomma 
      name=txtSomma><BR>Scrivi la somma totale</STRONG></FONT></TD>
    <TD align=middle><FONT face=Verdana size=2><STRONG><BR><BR><INPUT onclick=trova() type=button value=Calcola><BR>i 
      numeri che danno la somma 
totale</STRONG></FONT></TD></TR></TBODY></TABLE></FORM></BODY></HTML>
-- 
     * b *
   *   y   *
 *   Piero   *

 Codice da copiare:
ETC.ETC.
Ciao P/ero,
adesso funziona bene, ma ho un'ultima domanda da fare sia a te che a
Sephiroth (non vorrei approfittare troppo!) ma lo script fa anche
operazioni con decimali? ad esempio se inserisco i numeri 183.50 183.50 e
la somma 367, non viene trovata la corrispondente somma. Grazie di tutto,
in attesa, buon lavoro.


 183.50 e la somma 367, non viene trovata la corrispondente somma.
Ti sei risposto da solo.


in attesa, buon lavoro.
I numeri frazionari non li avevo notati nel tuo post, cosi' non li
avevo previsti.
Ad ogni modo quando ti dico di copiare, ed incollare su un file con
estensione HTML, non significa che devi aprire un word processor per
incollarci il testo e salvarlo con formato HTML (o formato
proprietario del word processor). Bastava semplicemente aprire un
piccolo editor di testo, incollare il testo e poi salvare con nome
tipo nome_del_file.html
E poi Word e HTML c'entrano come cavoli a merenda, quindi ti consiglio
anche di buttarlo via Word.
Ti posto il codice modificato per il calcolo con i numeri in virgola
mobile.
Pero' ti avverto che la gestione dei numeri in virgola mobile e' assai
complessa sui calcolatori: un numero razionale e' rappresentato su un
calcolatore sempre in approssimazione. Cio' significa che c'e' un
rischio (la possibilita' dipende dall'implementazione del calcolatore,
o del sistema con cui vengono gestiti i numeri) che durante un calcolo
il risultato perda precisione.
Quindi solitamente quando si ha a che fare con numeri in virgola
mobile (sottoinsieme dei razionali) si stabilisce un margine di
precisione entro il quale il risultato ottenuto dopo la computazione
si considera identico a quello desiderato, e quindi accettabile. In
pratica, date due variabili, se il modulo della loro differenza non
supera il margine di errore si considerano uguali i valori.
Il margine di precisione impostato per lo script che segue e'
1/1000000, vale a dire un milionesimo: piu' che sufficiente per i
calcoli finanziari.
<!-- INIZIO FILE -->
<HTML>
<body>
<H4>
Benvenuti nello script "Somma combinatoria" - by Sephiroth
</H4>
Questo script prende in input
righe di sequenze di numeri separati da spazi, e un intero
"somma". Per ogni sequenza si calcola una combinazione
lineare della sequenza con scalari 0 o 1 (insieme {0,1}).
Se il risultato della combinazione e' pari a "somma",
viene stampata la sequenza dei numeri della combinazione
con scalari non nulli.<BR>
In pratica, presa una sequenza di n numeri, si trovano
tutti i k&lt;n numeri tali che il loro totale faccia
"somma"; questo per ogni riga.
<BR><BR>
Immetti i numeri separati da spazi:<BR>
<textarea name="txtNumeri" id="txtNumeri" cols="30" rows="20">
</textarea><BR>
Immetti la somma totale:<BR>
<input type="text" name="txtSomma" id="txtSomma"><BR>
<script type="text/javascript">
<!--
// Puoi impostare di seguito il margine
// di precisione
var PRECISIONE = 0.000001;
function debug(strMsg) {
	output.value += strMsg + "\n";
}
function stampaCombinazione(strNum) {
	output.value += strNum + "\n";
}
function calcola(parziale, numInd, numeri, strNum, somma) {
	parziale += parseFloat(numeri[numInd]);
	if (Math.abs(parziale - somma) <= PRECISIONE) {
		//La prossima si puo' modificare cosi' per non
		//aggiungere "= somma"
		//strNum += numeri[numInd];
		strNum += numeri[numInd] + " = " + parziale;
		stampaCombinazione(strNum);
	}
	else if (parziale < somma && numInd < numeri.length-1) {
		strNum += numeri[numInd] + " + ";
		for (numInd++;numInd < numeri.length;numInd++)
			calcola(parziale, numInd, numeri, strNum,
somma);
	}
}
function parseLine(line) {
	var parziale = 0;
	var numInd = 0;
	var numeri = line.split(" ");
	var strNum = "";
	var somma = parseFloat(txtSomma.value);
	if (0<numeri.length)
		for (var numInd=0;numInd < numeri.length;numInd++)
			calcola(parziale, numInd, numeri, strNum,
somma);
}
function trova() {
	var lines = (String(txtNumeri.value)).split("\n");
	for (var i=0;i<lines.length;i++) {
		var line = String(lines[i]);
		line = line.replace(/^ +/, "");
		line = line.replace(/ +$/, "");
		line = line.replace(/ {2,}/g, " ");
		line = line.replace(/\r/g, "");
		if (!(line=="\n")) parseLine(line);
	}
}
// -->
</script>
Premi il bottone Calcola! per trovare quali numeri immessi
danno la somma specificata.<BR>
<input type="button" value="Calcola!" onclick="trova()">
<BR><BR>
Combinazioni trovate:<BR>
<textarea name="output" id="output" cols="40" rows="5">
</textarea>
</body>
</HTML>
<!-- FINE FILE -->
-- 
        Sephiroth
____________________________
Linux Registered User:181013


Volevo ringraziare Sephiroth, il programma funziona bene anche se la
versione grafica di P/ero e' piu' carina :-D cmq era quello che cercavo.
Ti ringrazio nuovamente e buon lavoro.


 cercavo. Ti ringrazio nuovamente e buon lavoro.
Ho capito! Eccoti accontentato. ;-)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-15">
<META content="MSHTML 6.00.2800.1126" name=GENERATOR>
<STYLE></STYLE>
<script type="text/javascript">
<!--
// Puoi impostare di seguito il margine di precisione
var PRECISIONE = 0.000001;
function debug(strMsg) {
uno.output.value += strMsg + "\n";
}
function stampaCombinazione(strNum) {
uno.output.value += strNum + "\n";
}
function calcola(parziale, numInd, numeri, strNum, somma) {
parziale += parseFloat(numeri[numInd]);
if (Math.abs(parziale - somma) <= PRECISIONE) {
//La prossima si puo' modificare cosi' per non aggiungere "= somma"
//strNum += numeri[numInd];
strNum += numeri[numInd] + " = " + parziale;
stampaCombinazione(strNum);
}
else if (parziale < somma && numInd < numeri.length-1) {
strNum += numeri[numInd] + " + ";
for (numInd++;numInd < numeri.length;numInd++)
calcola(parziale, numInd, numeri, strNum,somma);
}
}
function parseLine(line) {
var parziale = 0;
var numInd = 0;
var numeri = line.split(" ");
var strNum = "";
var somma = parseFloat(uno.txtSomma.value);
if (0<numeri.length)
for (var numInd=0;numInd < numeri.length;numInd++)
calcola(parziale, numInd, numeri, strNum,somma);
}
function trova() {
var lines = (String(uno.txtNumeri.value)).split("\n");
for (var i=0;i<lines.length;i++) {
var line = String(lines[i]);
line = line.replace(/^ +/, "");
line = line.replace(/ +$/, "");
line = line.replace(/ {2,}/g, " ");
line = line.replace(/\r/g, "");
if (!(line=="\n")) parseLine(line);
}
}
// -->
</script>
</HEAD>
<BODY bgColor=#e0f0ff>
<FORM name=uno>
<TABLE border=0>
  <TBODY>
  <TR>
    <TD style="TEXT-ALIGN: justify" colSpan=2>
<FONT face=Verdana 
      size=3><STRONG><DIV align=center><U>Benvenuti nello script "Somma combinatoria" - by Sephiroth</U></DIV></FONT><BR><FONT face=Verdana 
      size=2>Questo script prende in input righe di sequenze di numeri 
      separati da spazi, e un intero "somma". Per ogni sequenza si calcola una 
      combinazione lineare della sequenza con scalari 0 o 1 (insieme {0,1}). Se 
      il risultato della combinazione e' pari a "somma", viene stampata la 
      sequenza dei numeri della combinazione con scalari non nulli. In pratica, 
      presa una sequenza di n numeri, si trovano tutti i k&lt;n numeri tali che 
      il loro totale faccia "somma"; questo per ogni riga.</STRONG></FONT></TD></TR>
  <TR>
    <TD align=justify colSpan=2>
      <HR><BR><BR>
    </TD>
  <TR>
    <TD align=middle><FONT face=Verdana size=2><STRONG><TEXTAREA id=txtNumeri name=txtNumeri rows=10 cols=30></TEXTAREA><BR>Scrivi 
      i numeri separati da spazi</STRONG></FONT></TD>
    <TD align=middle><FONT face=Verdana size=2><STRONG><TEXTAREA id=output name=output rows=5 cols=40></TEXTAREA><BR>Combinazioni 
      trovate</STRONG></FONT><BR><BR><BR><INPUT type=reset value="Cancella tutto"></TD></TR>
  <TR>
    <TD align=middle>
      <DIV><FONT face=Verdana size=2><STRONG></DIV><FONT face=Verdana 
      size=2><STRONG></STRONG></FONT><BR><BR><INPUT id=txtSomma 
      name=txtSomma><BR>Scrivi la somma totale</STRONG></FONT></TD>
    <TD align=middle><FONT face=Verdana size=2><STRONG><BR><BR><INPUT onclick=trova() type=button value=Calcola><BR>i 
      numeri che danno la somma 
totale</STRONG></FONT></TD></TR></TBODY></TABLE></FORM></BODY></HTML>


GRAZIE 1000€
