Bonjour
Mathilde voulait écrire la multiplication 2 65 = 130, mais l'espace de multiplication a été omise et elle a écrit 265 = 130.
En corrigeant son texte, elle réajouta l'espace au mauvais endroit : 26 5 = 130.
Heureusement pour elle, sa multiplication était toujours exacte.
Mathias voulait écrire la multiplication 1 5 5775 = 28875, mais les espaces de multiplication ont été omises et il a écrit 155775 = 28875.
En corrigeant son texte, il réajouta les espaces aux mauvais endroits : 1 55 7 75 = 28875.
Voyant qu'il s'était trompé, il corrigea une deuxième fois : 15 5 77 5 = 28875.
Heureusement pour lui, ses multiplications étaient toujours exactes.
Quant à Mathias, il était subjugué par les multiplications suivantes :
En effet, il voulait écrire la multiplication 19 75 395 = 562875, mais les espaces de multiplication ayant été omises, il a écrit 1975395 = 562875.
En corrigeant son texte, il réajouta les espaces aux mauvais endroits : 1975 3 95 = 562875.
Il constata, aussi, qu'avec les mêmes nombres, il pouvait obtenir :
1 975 3 95 = 277875, mais les espaces de multiplication ayant été omises, il a écrit 1975395 = 277875.
En corrigeant son texte, il réajouta les espaces aux mauvais endroits : 19 75 39 5 = 277875.
Heureusement pour lui, ses multiplications étaient toujours exactes.
Le grand-père Mathurin leur dit qu'il y a plein de nombres comme ceux-ci :
* avec un série d'infinité : 1999...9 × 5 = 1 × 999...95
* voire même, avec deux séries d'infinité : 666...674000...02 × 4 = 666...67 × 4000...024
Sans aller jusqu'aux infinités, sauriez-vous, avec un peu de programmation, fournir les produits de 2, 3 ou 4 nombres qui ont les propriétés exposées ci-dessus ?
S'il faut, pour certains, se limiter à une valeur pour chaque nombre, on peut prendre 999; bien entendu, les produits nuls sont à exclure.
Bonne réflexion !
Philoux
Salut philoux.
Voici en blanqué le tout début de mes recherches (ils ne contiennent que deux nombres pour l'instant, l'un à un chiffre l'autre à deux chiffres) :
à+
En fait je pense que le nombre de nombres possibles est trop grand et qu'il faudrait peut-être ajouter quelques contraintes...
à+
Bonjour, si on peut chercher avec excel, je veux bien essayer... mais il faut me dire où je me limite
Je ne sais pas si c'est faisable avec Excel...
Personnellement, je ne jure que par Pascal .
Si ça intéresse quelqu'un, je vais poster la suite de ce que j'ai trouvé...
Salut Borneo
Philoux a déjà proposé une limite
"S'il faut, pour certains, se limiter à une valeur pour chaque nombre, on peut prendre 999; bien entendu, les produits nuls sont à exclure."
Bonne réflexion à toi!
En faite je n'ai vu cette énigme que maintenant mais je ne pense pas qu'elle est difficile, en tt cas merci pour ton petit up cinnamon .
bonjour
oui,
l'autre contrainte que je n'ai pas mise est celle permettant d'éviter comme soluce les 111*11 par exemple...
Bonne poursuite de réflexion...
Philoux
D'accord, je vais regarder ce que je trouve avec excel. Donc, on poste en blanqué.
blanqué on
blanqué off
Re,
J'ai trouvé un programme qui fonctionne pour tous les produits de deux termes, quelle que soit la valeur (je me suis arrêtée à 9999 ).
J'essaie de le faire marcher pour 3 et 4 termes...
Mes résultats arrivent ...
Cette fois-ci je n'ai pas oublié d'écarter les produits nuls et les produits de la forme 888*8 = 8*888 .
Voilà ce que je trouve :
Voilà.
à+
En plus je crois qu'il est inutile de blanker dans ce genre d'énigme car les solutions sont trés nombreuses elles n'aideront pas les programmeurs à avancé, c'est juste mon avis .
Je ne sais pas si cela t'interesse où non mais en tt cas voicis une énigme [pgm] posté par philoux également et que je trouve trés interessante JFF : [pgm] Produits de puissances :*::*:, en faite le programme que j'ai réaliser n'a pas pu répondre à la question de philoux (c.a.d pour n=20) car les cas deviennet trés nombreuses même avec tous les essaies que j'ai faites pour minimiser les vérifications, tout ce que j'ai pu faire est de trouver les solutions pour n<=16, donc si tu pourra réaliser un prgramme qui génére toutes les solutions pour n=20 se sera vraiment genial, bon courage .
Merci master_och.
Tu n'as pas tort pour le blanquage...
Là il y a 73 solutions mais je peux en trouver autant que j'en veux .
"Là il y a 73 solutions mais je peux en trouver autant que j'en veux."
En fait j'ai parlé un peu trop vite .
Ma machine n'est pas assez puissante donc au bout d'un moment je ne peux pas toutes les afficher.
J'arrive à en afficher 161 sans trop de problèmes.
Je vais regarder pour l'autre programme.
Je pense que tu mets la charrue avant les boeufs... Essaie d'abord avec 2 termes puis vois ce que ça donne (ce n'est qu'un conseil).
J'utilise Pascal. J'ai jeté un oeil au programme que tu as concocté pour l'autre énigme et j'avoue ne pas avoir tout compris.
Ce serait pas mal si tu pouvais mettre un peu plus d'indentations et de commentaires .
Voici un programme qui generera toutes les solutions en fonctions des données qu'il prenne, en faite si un nombre donne une solution avec un produit p, et s'il y a d'autres solutions avec un autre produit pour ce même nombre le programme n'affichera qu'une seule solution par nombre.
Pour mieux expliquer je vous donne un exemple:
si on par exemple on prend le nombre n=abcdef
si ce nombre donne une solution s1 :ab . cdef= ab . cd . ef = p1
et que ce même nombre donne une deuxiéme solution s2 abc . def = abcd .ef = a. bcdef = p2
on obtient donc 2 solutions pour un seul nombre abcdef, dans ce cas le programme n'affichera qu'une seule solution.
Voici le programme:
uses wincrt;
type tab=array[0..260] of longint;vect=array[1..9] of integer;
procedure calcul(ch:string;pos1:vect;n:integer;var res:longint);var x:real;e,i,j,k:integer;m:longint;t:vect;
begin j:=0;repeat inc(j);if j<n then val(copy(ch,pos1[j ],(pos1[j+1]-pos1[j ])),t[j ],e)
else val(copy(ch,pos1[j ],(length(ch)-pos1[j ]+1)),t[j ],e);until(j=n);val(copy(ch,1,pos1[1]-1),t[n+1],e);
x:=0;k:=1;for j:=1 to n+1 do begin x:=t[j ]*x;if (x/1000000000)> 2.147 then begin k:=0;j:=n+1;end;end;
if k=0 then res:=0 else begin res:=1;for j:=1 to n+1 do res:=res*t[j];end;end;
function po(res:tab;n:integer):integer;var i,j:integer;begin if n=1 then po:=0
else begin i:=0;repeat inc(i);until(res[i ]=res[n])or(i=n-1);if res[i ]=res[n] then po:=i else po:=0;end;end;
var nbr,b,q,c,d,k,i,m,p,j,e,l,lim3,lim4:integer;a,lim1,lim2:longint;ch1:string;res:tab;posi:vect;
ch:array[1..260]of string[11];
begin
nbr:=0;writeln('donnez les limites de l''interval dans lequel vous voulez chercher les solutions');
write('donner la première limite: ');readln(lim1);write('donnez la dexième limite: ');readln(lim2);
if lim1<=lim2 then begin writeln('donner les limites des nombres de termes des solutions: :');
write('donner la premiére limite : ');readln(lim3);write('donner la 2éme limite : ');readln(lim4);
if (lim3>1)and(lim4>=lim3)then begin
write('donnez le nombre de solutions que vous voulez afficher pour ce coup: ');readln(m);if m>0 then begin p:=nbr;
for a:=lim1 to lim2 do begin str(a,ch1);l:=0;
for i:=1 to length(ch1)-1 do if ch1[i ]<>ch1[i+1]then begin l:=1;i:=length(ch1)-1;end;
if l=1 then begin k:=0;q:=0;b:=0;for j:=lim3 to lim4 do begin i:=0;posi[1 ]:=1;d:=0;
repeat inc(i);if posi[i ]<(length(ch1)+i-j)then begin inc(posi[i ]);c:=1;
if i>1 then begin val(copy(ch1,posi[i-1],posi[i ]-posi[i-1]),c,e);if c=0 then dec(i);end;
if c>0 then begin if i<j then begin posi[i+1]:=posi[i ];end
else begin calcul(ch1,posi,j,res[k+1]);if res[k+1]>0 then begin ch[k+1]:=copy(ch1,1,posi[1]-1);
for i:=1 to j do if(i<j)then ch[k+1]:=ch[k+1]+' '+copy(ch1,posi[i ],(posi[i+1]-posi[i ]))
else ch[k+1]:=ch[k+1]+' '+copy(ch1,posi[i ],(length(ch1)-posi[i ]+1));
if po(res,k+1)=0 then inc(k)
else if((b=0)or(res[k+1]=res[q ])) then
begin inc(b);q:=po(res,k+1);if b=1 then write(ch[q ],' = ');write(ch[k+1],' = ');end;end;
dec(i);end;end;end
else if i>1 then i:=i-2
else d:=1;until(d=1);end;end;
if(b>0)then begin inc(nbr);writeln(res[q],' (',nbr,') ');
if((nbr-m)=p)then begin write('donnez le nombre de solutions que vous voulez afficher pour ce coup: ');readln(m);
if m<1 then a:=lim2;p:=nbr;end;end;end;end;end;end;end.
Maintenant j'explique un peu le fonctionnement du programme pour ceux qui veulent le tester:
¤¤ Vous devez au début donner au programme les limites du nombre
n (dans l'exemple n est abcdef mais le nombre de chiffre n'est pas respecté biensure ).
la deuxiéme limite doit être superieur ou égale à la premiére limite.
¤¤ en suite le programme demandera les limites de nombre e termes(c.a.d le nombre d'espaces à inserer +1), le prmiére limite doit être superieur ou égale 2, la deuxiéme limite doit être >= 1ére limite.
¤¤ enfin le programme vous demandera le nombre de solutions que vous voulez voir.Supposant que vous avez donné un nombre n aprés avoir générer n solutions"s'ils existent n solutions biensûre", le programme vous demandera à nouveau de le nombre de solutions que vous voulez afficher pour le prochain coup et ainsi de suite...
Et je dirai enfin merci à philoux pour cette jolie énigme .
édit Océane : balises italiques remplacées
Voici une améloratin du programme:
uses wincrt;
type tab=array[0..260] of longint;vect=array[1..9] of integer;
procedure calcul(ch:string;pos1:vect;n:integer;var res:longint);var x:real;e,i,j,k:integer;m:longint;t:vect;
begin j:=0;repeat inc(j);if j<n then val(copy(ch,pos1[j ],(pos1[j+1]-pos1[j ])),t[j ],e)
else val(copy(ch,pos1[j ],(length(ch)-pos1[j ]+1)),t[j ],e);until(j=n);val(copy(ch,1,pos1[1]-1),t[n+1],e);
x:=0;k:=1;for j:=1 to n+1 do begin x:=t[j ]*x;if (x/1000000000)> 2.147 then begin k:=0;j:=n+1;end;end;
if k=0 then res:=0 else begin res:=1;for j:=1 to n+1 do res:=res*t[j];end;end;
function po(res:tab;n:integer):integer;var i,j:integer;begin if n=1 then po:=0
else begin i:=0;repeat inc(i);until(res[i ]=res[n])or(i=n-1);if res[i ]=res[n] then po:=i else po:=0;end;end;
function dif(ch1,ch2:string):boolean;var i,j,n,p,n1,n2:integer;t1,t2:array[1..10]of integer;begin
j:=0;i:=0;n:=1;repeat inc(j);if(ch1[j]=' ')then begin inc(i);val(copy(ch1,n,j-n),t1[i ],p);n:=j+1;end;
until(j=length(ch1));n1:=i+1;val(copy(ch1,n,j-n+1),t1[n1],p);
j:=0;i:=0;n:=1;repeat inc(j);if(ch2[j]=' ')then begin inc(i);val(copy(ch2,n,j-n),t2[i ],p);n:=j+1;end;
until(j=length(ch2));n2:=i+1;val(copy(ch2,n,j-n+1),t2[n2],p);p:=1;
for j:=1 to n1 do if t1[j ]>1 then begin p:=0;for i:=1 to n2 do if(t2[i ]=t1[j ])then begin p:=1;i:=n2;end;
if p=0 then j:=n1;end;
if p=1 then for j:=1 to n2 do if t2[j ]>1 then begin p:=0;for i:=1 to n1 do
if(t2[j ]=t1[i ])then begin p:=1;i:=n1;end;if p=0 then j:=n2;end;
if p=0 then dif:=true else dif:=false;end;
var nbr,b,q,c,d,k,i,m,p,j,e,l,lim3,lim4:integer;a,lim1,lim2:longint;ch1:string;res:tab;posi:vect;
ch:array[1..260]of string[11];
begin
nbr:=0;writeln('donnez les limites de l''interval dans lequel vous voulez chercher les solutions');
write('donner la première limite: ');readln(lim1);write('donnez la dexième limite: ');readln(lim2);
if lim1<=lim2 then begin writeln('donner les limites des nombres de termes des solutions: :');
write('donner la premiére limite : ');readln(lim3);write('donner la 2éme limite : ');readln(lim4);
if (lim3>1)and(lim4>=lim3)then begin
write('donnez le nombre de solutions que vous voulez afficher pour ce coup: ');readln(m);if m>0 then begin p:=nbr;
for a:=lim1 to lim2 do begin str(a,ch1);l:=0;
for i:=1 to length(ch1)-1 do if ch1[i ]<>ch1[i+1]then begin l:=1;i:=length(ch1)-1;end;
if l=1 then begin k:=0;q:=0;b:=0;for j:=lim3-1 to lim4-1 do begin i:=0;posi[1 ]:=1;d:=0;
repeat inc(i);if posi[i ]<(length(ch1)+i-j)then begin inc(posi[i ]);c:=1;
if i>1 then begin val(copy(ch1,posi[i-1],posi[i ]-posi[i-1]),c,e);if c=0 then dec(i);end;
if c>0 then begin if i<j then begin posi[i+1]:=posi[i ];end
else begin calcul(ch1,posi,j,res[k+1]);if res[k+1]>0 then begin ch[k+1]:=copy(ch1,1,posi[1]-1);
for i:=1 to j do if(i<j)then ch[k+1]:=ch[k+1]+' '+copy(ch1,posi[i ],(posi[i+1]-posi[i ]))
else ch[k+1]:=ch[k+1]+' '+copy(ch1,posi[i ],(length(ch1)-posi[i ]+1));
if po(res,k+1)=0 then inc(k)
else if((b=0)and dif(ch[k+1],ch[po(res,k+1)]))or(res[k+1]=res[q ]) then
begin inc(b);q:=po(res,k+1);if b=1 then write(ch[q ],' = ');write( ch[k+1],' = ');end;end;
dec(i);end;end;end
else if i>1 then i:=i-2
else d:=1;until(d=1);end;end;
if(b>0)then begin inc(nbr);writeln(res[q],' (',nbr,') ');
if((nbr-m)=p)then begin write('donnez le nombre de solutions que vous voulez afficher pour ce coup: ');readln(m);
if m<1 then a:=lim2;p:=nbr;end;end;end;end;end;end;end.
J'ai ajouté une fonction dif, qui illimine les solutions tels que: 11 001 1 = 1 1 0011 en faite c'est une fonction qui vérifie s'il existe au moin un terme dans l'un des 2 produits qui est différent de tous les termes de l'autre produit.
par exemple dans la solution 1 001 95 = 1 0019 5
le terme 95 du premier produit est différent de tous les termes de l'autre produit qui sont 1,19 et 5 (et biensûre ce terme different doit être >1).
édit océane : balises italiques modifiées
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :