2017-11-09 13 views
-2

나는 학교 프로젝트를 진행하고 있으며이 문제에 대해 (거의) 분노하고 있습니다. 내 솔루션의 유효성은 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으로 분할하고, 얘기 할 수 있다면 나는 감사 드리겠습니다,이에 많은 시간을 할애하고 올바른 솔루션을 함께 제공되지 않았다. 다들 감사 해요.

추신 : 저는 체코 인입니다. 변수와 함수의 이름이 영어가 아니므로 죄송 합니다만, 문제가되지 않을 것입니다.

+0

* 입력을 모르지만 입력이 실패했음을 압니다 *. 프로그램에 대한 사용자 입력이 실패하게되는 원인을 모른다고 말하는 것입니까? – lurker

+0

당신은'Soustava'가 1이되도록 허용하지 않음으로써'Ln (Soustava)'케이스를 처리했습니다 (프로그램에서 음수를 입력해도 실패 할 수 있습니다). 이 경우 mod가 의심됩니다. 'mod'의 두 번째 인수가 0이면, 당신은 0으로 나누기 시나리오를가집니다. 즉,'Mocnina (Sousstava, i + 1)'이 0을 반환하면 문제가 발생합니다. 'Mocnina'는 정수형 지수 연산을 수행하기 때문에 오버플로가 0이되는 정수 오버플로 조건 일 수 있습니다. – lurker

+1

일부 디버깅을 수행합니다. 왜 사람들은 더 이상 디버깅하지 않습니까? –

답변

1

Cislo = 0Ln(Cislo) 다음의 계산이 Ln(0) (Ln()의 허용 범위 밖) 정의 때문이다 런타임 에러 (200)를 제공한다.

+0

감사합니다. 나는 이론적 인 수학을 공부하고 있으며 숫자 ZERO가 자연수에 있다고 정의하지 않았습니다. 당신은 올바른 생각을 가지고 있습니다. 도와 주셔서 감사 드리며 좋은 하루 보내십시오. – Palindrom

+0

이것은 자연수와 전혀 관련이 없습니다. @Palindrom –

+0

@DavidHeffernan - 틀 렸습니다. 함수 로그는 간격 (0, infty)에 정의됩니다. 만약 자연수의 집합이 {0, 1, ...}, BUT {1, 2, 3, ...}이 아닌 것으로 가정한다면, 입력 데이터는 자연수 일뿐입니다. (잘못된) Cislo = 0 일 때 케이스를 테스트 할 필요가 없다. – Palindrom