Erreur "system error divide by zero or overflow error"
Bonjour,
Code:
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
| PROGRAM BAC2014 ;
USES WINCRT ;
VAR i,n,m:integer;
procedure saisir(var n,m:integer);
begin
repeat
writeln('ecrire l''entier n et m');
readln(n,m);
until ((n>=100)and(m>n));
end;
function chercher(m,n:integer):boolean;
var i,s,a,x,b,nb,e:integer;
ch:string;
test:boolean;
begin
for i:=n to m do
begin
s:=0;
str(i,ch);
for a:=1 to length(ch) do
begin
val(ch[i],x,e);
s:=x+s;
end;
nb:=0;
for b:=1 to i-1 do
begin
if (((i-1) mod b)=0) then
nb:=nb+1;
end;
if((i mod s=0) and(nb=2)) then
test:=true
else test:=false
end;
chercher:=test;
end;
begin
saisir(n,m);
for i:=n to m do
begin
if chercher(m,n)=true then
writeln(i,'car',i,' est hashard et son predecesseur ',i-1,'est un nombre premier') ;
end;
end. |
Je n'ai pas compris où se trouve l'erreur (system error divide by zero or overflow error)
Erreur "system error divide by zero or overflow error"
Bonjour, :D
Citation:
Envoyé par
anis978
... Je n'ai pas compris où se trouve l'erreur (system error divide by zero or overflow error)
... :weird: Et un lecteur a beaucoup de mal à comprendre la finalité du programme, faute de toute explication :koi: .
Que voulais-tu faire ?
Je remarquerai simplement que:
a) la variable (e) doit être du type LongInt et contient le code d'erreur relatif à l'échec éventuel de l'instruction Val(Ch[ i], x, e);
b) la division interdite par zéro intervient lors de l'appel de (i MOD s), ce qui implique que (s) reste nul, que son incrémentation
ne s'est jamais réellement produite, et donc que l'incrément (x) est lui aussi toujours nul.
Tu devrais par curiosité afficher le code d'erreur, et introduire une condition de poursuite du calcul, évitant ainsi le plantage du programme:
Bien que la finalité du programme reste pour moi un sombre mystère :aie:, j'ai la vague impression que (i) devrait être borné inclusivement par 48 et 57 ... :mrgreen:
Erreur "system error divide by zero or overflow error"
Voilà désormais un énoncé parfaitement clair, auquel ton programme principal répond dans sa structure; il n'y manque que l'indentation indispensable à la compréhension rapide du code:
Code:
1 2 3 4 5 6 7 8
| BEGIN
Saisir(n,m);
FOR i:=n TO m DO
BEGIN
IF ((Premier(m,n)=true) AND (Harshad(m,n)=true)) THEN
WriteLn(i,'car',i,' est hashard et son prédécesseur ',(i-1),'est un nombre premier') ;
END
END. |
L'usage des majuscules est souhaitable (malgré l'insensibilité du Pascal à la casse) en ce qu'il facilite la lecture du texte source; je m'en suis toujours tenu au style recommandé dans les premières bibles du Turbo Pascal éditées par Borland dans les années 80.
Il ne reste donc qu'à examiner séparément les fonctions booléennes Premier(...) et Harshad(...).
Questions générales:
1°) Les entiers négatifs apparaissent-ils dans les calculs ? Non, probablement, ce qui autorise l'intervention de variables au format Word et double l'étendue du domaine des entiers naturels (MaxWord = 216 - 1 = 65535).
2°) Il s'agit de détecter au cours d'une énumération tous les couples d'entiers successifs (i - 1 , i) tels que le plus petit soit premier, et son suivant hashard: le coeur de ton programme ne devrait-il pas présenter une structure apparentée à ce qui suit ?
Code:
1 2 3 4 5
| FOR i:=n TO m DO
BEGIN
IF ((Premier(i - 1)=true) AND (Harshad(i)=true)) THEN
WriteLn(i,'car',i,' est hashard et son prédécesseur ',(i-1),'est un nombre premier') ;
END |
Chacune des fonctions booléennes ne devrait dépendre que de l'indice courant (i).
3°) L'expression booléenne (Test = True) n'est-elle pas identiquement équivalente à (Test) ? L'instruction conditionnelle précédente peut donc être abrégée:
Code:
IF (Premier(i - 1) AND Harshad(i)) THEN ...
ou si l'on veut se conformer aux exigences des plus maniaques (dont je fais partie):
Code:
1 2 3 4
| VAR TestP, TestH: Boolean;
... / ...
TestP:= Premier(i - 1); TestH:= Harshad(i);
IF (TestP AND TestH) THEN ... |
On pourra ensuite passer au contenu de ces fonctions.
Erreur "system error divide by zero or overflow error"
La mise au point militante qui vient d'être faite me fait songer songer au pugilat survenu entre deux manifestants, dont d'un était contre la guerre, et l'autre pour la paix :aie:
La définition donnée a l'incontestable mérite de la concision, mais n'empêche pas la subsistance de sa version traditionnelle, même sur des sites qui n'ont pas la réputation d'être tenus par des demeurés :mrgreen::
1_ A prime number (or prime integer, often simply called a "prime" for short) is a positive integer p>1 that has no positive integer divisors other than 1 and p itself.
More concisely, a prime number p is a positive integer having exactly one positive divisor other than 1, meaning it is a number that cannot be factored.
2_ A number n is prime if it is greater than 1 and has no positive divisors except 1 and n.
A natural number is prime if and only if it has exactly two (positive) divisors.
anis978 a suffisamment de pain sur la planche pour qu'on ne lui conteste pas une définition reçue de l'un de ses professeurs, et dépourvue de toute incidence sur l'algorithme en chantier :D.
Erreur "system error divide by zero or overflow error"
@ anis978, justement: un détail qui m'avait échappé m'inquiète un peu:
Citation:
Envoyé par
anis978
... J'ai essayé de changer le type de (e) de Integer à LongInt mais Pascal ne l'as pas accepté, il m'a obligé de la déclarer comme type Integer ...
Quelle version du Turbo Pascal utilises-tu ? Je crois me rappeler que la version 5.5 n'acceptait pas les entiers longs ...
De plus, faut-il vraiment que tu utilises WinCrt ?
Si ce n'est fait il serait bon, à brève échéance, que tu installes TP7 (téléchargeable sur Developpez.com, un excellent site pour Développeurs-Programmeurs Pro(1)).
Soit dit pour te rassurer, le présent programme est réalisable sur une version ancienne.
(1)Publicité entièrement objective et désintéressée.
# PS: Il faut vraiment indenter le code source (à défaut d'user de majuscules) afin de ne pas braquer les intervenants, dont l'irritation est légitime :D
@ Jipété :salut: Pas de panique, on examinera les fonctions séparément.
Erreur "system error divide by zero or overflow error"
@ anis978 J'ai repris le sujet de ton problème, et viens de m'apercevoir qu'il a fait l'objet d'un débat sur ce même forum il y a un peu plus de 3 ans.
Rendons à Euclide ce qui est à Euclide
1°)
Citation:
Envoyé par
Jipété
Quoi ? Tu voudrais que les gens, à notre époque, fassent l'effort de chercher ? :ptdr:
Ben oui, j'y crois toujours. Il ne faut pas sous-estimer les internautes.
2°)
Citation:
Envoyé par
Jipété
2°) Pas d'accord, mais alors, pas d'accord du tout ! T'en as oublié un bout :
... / ...
par soi-même et l'unité, en français de 2018 :P, commentaire en gras de votre serviteur.
Il faut bien discerner la version d'origine d'un texte vieux de vingt-trois siècles, et ne pas la confondre avec les commentaires du traducteur, imprimés il y a seulement 386 ans (avec privilège du Roi :D).
Là, je suis contraint de reprendre plus tard.
3 pièce(s) jointe(s)
Suggestions de lecture au coin du feu
Extrait d'une édition trilingue (grec, latin & français) et plus récente (1814) des oeuvres d'Euclide, disponible sur le site de la Bibliothèque de l'Université de Toronto:
les 23 définitions par lesquelles s'ouvre le septième livre (pages 381 à 384).
Ceux qui se méfient à bon droit d'Internet peuvent aller consulter sur place (prévoir un équipement chaud et les chiens de traîneau).
Pièce jointe 350553
Pièce jointe 350557
Pièce jointe 350635
Suggestion de lectures prolongées au coin d'un bon feu
Pour les auteurs anciens, l'unité (monade) se distingue de la multitude, représentée par les nombres.
L'unité n'étant pas considérée comme un nombre, la question de sa primalité ne se pose pas.
D'autre part un nombre (a) en mesure un autre plus grand (b) si celui-ci peut être décomposé en plusieurs parties égales, de valeur commune (a): l'égalité supposant la comparaison d'au moins deux termes, le diviseur (a) est nécessairement inférieur au dividende (b); ainsi, selon cette définition, la division d'un nombre par lui-même n'a aucun sens, et un nombre n'est pas inclus dans la liste de ses diviseurs.
Voilà la réponse stricte au différent qui est apparu.
Les successeurs, traducteurs et commentateurs d'Euclide ont varié sur ce point. Je ne saurais mieux faire que de vous renvoyer à l'article déjà cité (#9)(1).
(1) Un intervenant n'a-t-il pas récemment stigmatisé ceux qui ne se donnent pas la peine de chercher ? :mrgreen:
3 pièce(s) jointe(s)
Revenons (enfin) à nos moutons
Il m'était apparu très vite que le recours aux instructions (. DIV 10) et (. MOD 10) fournissait le moyen le plus simple de caractériser les nombres Harshad, comme un intervenant l'avait déjà remarqué à la fin du forum déjà mentionné.
Une fonction booléenne peut fournir directement la réponse, sans qu'il soit nécessaire de passer par la somme explicite des chiffres:
Code:
1 2 3 4 5 6 7 8 9 10
| ... / ...
VAR r, s: Byte; p, q: LongInt;
BEGIN
s:= 0; p:= k;
WHILE (p>0) DO BEGIN
q:= p DIV Base; r:= p MOD Base;
Inc(s, r); p:= q
END;
r:= k MOD s; T_Harshad:= (r=0)
... / ... |
Les entiers recherchés ne sont pas rares, mais leur répartition paraît très irrégulière; il n'y a pas (ou du moins je n'ai pas vu) de critère de présélection permettant d'accélérer l'inventaire. Il faut donc tester tous les entiers présents dans l'intervalle imposé; exemples trouvés (presque) au hasard:
Pièce jointe 351738
Il en va tout autrement de la recherche des couples associant un nombre Harshad à son prédécesseur premier, parce que celui-ci est d'un type facile à caractériser: tous les nombres premiers (p) supérieurs à 3 vérifient en effet:
p MOD 6 = 1 ou 5
condition permettant une énumération trois fois plus rapide par quelques instructions du genre:
Code:
1 2 3
| REPEAT ... / ...
Inc(k, Delta); Delta:= 6 - Delta
UNTIL ... |
Le seul point délicat est la détermination du premier entier à tester (N1) et de l'incrément correspondant (Delta = Dn), qui suit immédiatement la saisie de la valeur de départ (Nini = p):
Code:
1 2 3 4 5 6 7 8
| ... / ...
q:= p DIV 6; r:= p MOD 6; s:= 6 * q;
IF (r<2) THEN BEGIN
N1:= s + 1; Dn:= 4
END
ELSE BEGIN
N1:= s + 5; Dn:= 2
END; ... / ... |
L'exclusion de la divisibilité par (2) ou par (3) autorise un test de primalité simplifié apparenté au précédent:
Code:
1 2 3 4 5 6 7 8 9
| FUNCTION T_Primalite(k: LongInt): Boolean;
VAR p, q, r: LongInt; Q2: Extended;
BEGIN
q:= 1; p:= 4;
REPEAT
Inc(q, p); p:= 6 - p; r:= k MOD q; Q2:= Sqr(1.0 * q)
UNTIL ((Q2>k) OR (r=0));
T_Primalite:= (r>0)
END; |
et dont le seul défaut est de ne donner une réponse correcte qu'à partir de (6) - pour une raison évidente; il suffit de modifier la condition d'arrêt
Code:
T_Primalite:= ((r>0) OR (k=5))
pour obtenir un fonctionnement correct dans le cas où (k = 5) .
Voici ce que l'on obtient pour les paires d'entiers (k, k + 1) au format LongInt, des plus petits aux plus grands:
Pièce jointe 351753
La recherche des triplets résultant de l'encadrement d'un nombre premier (k) par deux nombres de Harshad (k - 1 , k + 1) relève du même type d'algorithme; celle des premiers jumeaux (6*m - 1 , 6*m + 1) bordant un nombre de Harshad (6*m) fait appel à un procédé un peu différent, mais dépourvu de difficultés:
Pièce jointe 351756