[Pascal]liczby super'b'pierwsze

0

Mam napisać program który wypisze liczbę liczb super'b'pierwszych w przedziale od 2 do 1000 wynika ma być około 50 a mi wyrzuca 89 i nie mogę się doszukać błędu, jak dla mnie wygląda, że jest w porządku i powinno działać. Proszę o sugestie jak to poprawić. Liczba super'b'pierwsza to taka która jest pierwsza, której suma cyfr jest liczbą pierwszą oraz suma cyfr jej reprezentacji binarnej jest liczbą pierwszą.

program spierw;
uses crt;
var l,d:longint;
function pierwsza(liczba:longint):boolean;
var a:longint;
begin
pierwsza:=true;
for a:=2 to liczba div 2 do
begin
if (liczba mod a=0) then
pierwsza:=false;
end; end;

function sumadec(liczba:longint):longint;
var suma:longint;
begin
suma:=0;
while liczba > 0 do
begin
suma:=suma + liczba mod 10;
liczba:=liczba div 10;
end;
sumadec:=suma;
end;

function dectobin(liczba:longint):longint;
var
bin:string;
begin
repeat
if (liczba mod 2=1)
then bin:='1' + bin
else
bin:='0' + bin;
liczba:=liczba div 2;
until liczba=0;
Val(bin,dectobin);
end;
begin
clrscr;
d:=0;
for l:=2 to 1000 do
begin
if pierwsza(l)=true then
if pierwsza(sumadec(l))=true then
if pierwsza(sumadec(dectobin(l)))=true then inc(d);
end;
writeln('w zakresie od 2 do 1000 jest: ',d,' liczb super"b"pierwszych');
readkey;
end.
0

po BEGIN w BinToDec dodaj instrukcję
bin:='';

swoją drogą strasznie to skomplikowałeś, a może tak:function SumaCyfr(k,c:longint):boolean;
var s:longint;
begin
s:=0;
while k>0 do begin
s:=k mod c + s;
k:=k div c;
end;
SumaCyfr:=pierwsza(s)
end;

var n,l:longint;
begin
for n:=2 to 1000 do
if pierwsza(n) and sumacyfr(n,2) and sumacyfr(n,10) then begin
l:=l+1;
writeln(l:3, n:10)
end
end.

0

Dzięki podziałało:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1