Паскаль: сумма цифр в пределах диапазона

Сколько натуральных чисел меньше 1000, сумма цифр которых равна 6?

Не знаю, как начать это с помощью Pascal. На Python мой скрипт будет выглядеть примерно так:

a = 1
b = 1000
for i in range(a,b):
........

Я не знаю, как получить доступ к цифрам. Если бы кто-то мог дать мне голову, я мог бы добиться некоторого прогресса отсюда.


person Cloud    schedule 19.12.2013    source источник
comment
Я пытаюсь научиться использовать Паскаль для соревнований. Мне нужно научиться справляться с такими ситуациями, так как на экзамене будут похожие проблемы.   -  person Cloud    schedule 19.12.2013
comment
Ух ты. Я не видел код на Паскале последние 15 или 20 лет. Ваш вопрос - взрыв из прошлого! Из любопытства, могу я спросить, как вы сегодня пришли к программированию на Паскале?   -  person thb    schedule 19.12.2013
comment
Я вижу твой ответ @MrPhi. Однажды я изучал Паскаль в колледже, но это был 1986 год. Надеюсь, кто-то здесь помнит свой Паскаль. Я забыл это.   -  person thb    schedule 19.12.2013
comment
Может ли кто-нибудь предложить код Python хотя бы для начала?   -  person Cloud    schedule 19.12.2013
comment
@Cloud Подумайте, как получить последнюю цифру любого целого числа. Затем подумайте, как преобразовать число, удалив последнюю цифру. Подумайте, как это можно сделать арифметически. Например, как получить 72 из 720 или 725.   -  person Ingo    schedule 19.12.2013


Ответы (3)


Вот решение без ненужного преобразования в строку. Он работает, получая крайнюю правую цифру, добавляя ее значение к аккумулятору Total, а затем удаляя крайнюю правую цифру, выполняя целочисленное деление на 10 и повторяя процесс до тех пор, пока у нас ничего не останется.

var
  Value, Digit, Total, NumValues: Integer;
  i: Integer;
begin
  NumValues := 0;

  for i := 1 to 1000 do
  begin
    Value := i;
    Total := 0;

    repeat
      Digit := Value mod 10;
      Total := Total + Digit;
      Value := Value div 10;
    until Value = 0;

    if Total = 6 then
      Inc(NumValues);
  end;

  WriteLn ('I found ', NumValues, ' numbers whose digits add up to six');
  ReadLn;
end.
person Ken White    schedule 19.12.2013
comment
Это дает правильный ответ 28. Если кому-то интересно, я решил это вручную, реализуя простой шаблон здесь. Есть 7 чисел, которые в сумме дают 6 от 06 до 60. Это 6 чисел, которые в сумме дают 6 от 105 до 150, 5 чисел от 204 до 240 и так далее. Схема 7+6+5+4+3+2+1=28. Это просто чтобы подтвердить, что я не использовал это как единственное средство для выполнения моей домашней работы. Я знал ответ, но хотел смоделировать свой алгоритм и нуждался в вашей помощи, чтобы сделать это. - person Cloud; 20.12.2013

Ваш вопрос в основном заключается в том, "как выполняется цикл for в Pascal"... Просто проверьте документацию, например. здесь: http://pascal-programming.info/lesson4.php#JUMP3

Также я чувствую запах домашней работы. ;)

person Draugr    schedule 19.12.2013
comment
Спасибо за ссылку, а какой алгоритм? - person Cloud; 19.12.2013
comment
Я не буду решать за вас ваш вопрос об Австралийской олимпиаде по информатике ;) Для каждого числа вы должны проверить, равна ли сумма его цифр 6 или нет. Если вам не удастся сделать это с этой информацией, у вас позже возникнут гораздо большие проблемы. - person Draugr; 19.12.2013

Не обращая внимания на ехидные комментарии по поводу Pascal (это все еще жизнеспособный язык и живет в основе Delphi, его синтаксис был заимствован для нескольких «современных» языков), этот вопрос на самом деле сложнее, чем можно подумать. Сначала покажу программу, потом объясню.

var
 i, j, found, total: integer;
 s: string;

begin
 found:= 0;  // how many numbers whose digits add up to six
 for i:= 1 to 1000 do
  begin
   s:= inttostr (i);
   total:= 0;
   for j:= 1 to length (s) do
    total:= total + ord (s[j]) - ord ('0');
   if total = 6 then found:= found + 1;
  end;
 writeln ('I found ', found, ' numbers whose digits add up to six');
 readln
end.

Ключ преобразует номер индекса (i) в строку (это строка «inttostr (i)»), затем перебирает цифры строки и суммирует их.

person No'am Newman    schedule 19.12.2013
comment
Жаль, что вопрос не включал не использовать строки. - person Ingo; 19.12.2013