나는 학교 프로젝트를 진행하고 있으며이 문제에 대해 (거의) 분노하고 있습니다. 내 솔루션의 유효성은 95 %이지만 잘못된 입력이 1 개 있습니다. 입력을 알 수는 없지만 0으로 나누는 오류 코드 200 때문에 입력이 실패했습니다.TurboPascal7에서 0으로 나누기
내 프로젝트는 다음과 같습니다. 이 :
"정수의 숫자 합은 정수로 쓰여진 형식의 숫자 합계로 정의됩니다. 대개 우리는 숫자의 10 진수 (10 진수) 표현을 사용하여 숫자 합계를 계산하지만,이 연습에서는 주어진베이스에서 계산할 것입니다. 숫자가 주어진 밑수에 쓰여질 때 자연수의 숫자 합을 계산하는 함수를 작성하십시오. 이 함수를 사용하여 두 개의 자연수 (각 행에 10 진수로 표현) : 기본 B와 숫자 N을 읽는 프로그램을 작성하십시오. 출력은 기본 B에서 N의 숫자 합계 (10 진수 표현으로 작성)이어야합니다. . "
2 가지 조건을 추가하여 문제를 해결하려고했지만 아무 일도 없었습니다. 실수는 여전히 존재합니다. 여기에 찾을 수있는 수식을 사용하고 있습니다. https://en.wikipedia.org/wiki/Digit_sum. 다음은 코드 자체입니다. 길지 않습니다.
program CifernySoucetZobecneny;
var
Soustava, Cislo, i: longint;
HorniMez: longint;
Soucet: real;
function Mocnina(Zaklad: longint; Exponent: longint): longint;
var
i, Pomoc: longint;
begin
Pomoc := 1;
for i := 1 to Exponent do
begin
Pomoc := Pomoc * Zaklad;
end;
Mocnina := Pomoc;
end;
begin
readLn(Soustava);
readLn(Cislo);
if (Soustava = 0) then
begin
writeLn('0');
exit;
end;
if (Soustava = 1) then
begin
writeLn(Cislo);
exit;
end;
HorniMez := Trunc(Ln(Cislo)/Ln(Soustava));
Soucet := 0;
for i := 0 to HorniMez do
begin
Soucet := Soucet + ((1/Mocnina(Soustava, (i)))*((Cislo mod Mocnina(Soustava, (i+1))) - (Cislo mod Mocnina(Soustava, i))));
end;
writeLn(Soucet:0:0);
end.
누군가가 코드를보고 나는 많은 입력을 시도하기 때문에, 어디 0으로 분할하고, 얘기 할 수 있다면 나는 감사 드리겠습니다,이에 많은 시간을 할애하고 올바른 솔루션을 함께 제공되지 않았다. 다들 감사 해요.
추신 : 저는 체코 인입니다. 변수와 함수의 이름이 영어가 아니므로 죄송 합니다만, 문제가되지 않을 것입니다.
* 입력을 모르지만 입력이 실패했음을 압니다 *. 프로그램에 대한 사용자 입력이 실패하게되는 원인을 모른다고 말하는 것입니까? – lurker
당신은'Soustava'가 1이되도록 허용하지 않음으로써'Ln (Soustava)'케이스를 처리했습니다 (프로그램에서 음수를 입력해도 실패 할 수 있습니다). 이 경우 mod가 의심됩니다. 'mod'의 두 번째 인수가 0이면, 당신은 0으로 나누기 시나리오를가집니다. 즉,'Mocnina (Sousstava, i + 1)'이 0을 반환하면 문제가 발생합니다. 'Mocnina'는 정수형 지수 연산을 수행하기 때문에 오버플로가 0이되는 정수 오버플로 조건 일 수 있습니다. – lurker
일부 디버깅을 수행합니다. 왜 사람들은 더 이상 디버깅하지 않습니까? –