Найти числа с определенной суммой цифр

Ответить
brouken
Сообщения: 23
Зарегистрирован: 18 май 2008, 13:14

Добродушные форумщики помогите пожалуйсто решить задачу в паскале или посоветуйте способ решения и алгоритм:

Среди всех n-значных чисел указать те, сумма цифр потом равна данному числу k.
Аватара пользователя
demon416
Сообщения: 178
Зарегистрирован: 30 янв 2006, 14:03
Откуда: kirovskoe

В простейшем случае - проверять все цифры в цикле от 1 с n -1 нулями до n девяток
ака хинт: коментируйте код, самим же легче будет разобраться ;)
brouken
Сообщения: 23
Зарегистрирован: 18 май 2008, 13:14

Забыл самое главное. Своё решение, помогите плиз исправить ошибки:

Код: Выделить всё

program tz;
var
qwer,n,k,sum:real;
temp,pred,nach,delitel,i:integer;
begin
writeln('vvedite chislo k');
readln(k);
writeln('vvedite koli4estvo cifr v 4isle');
readln(n);
if n=1 then pred:=9;
if n=2 then pred:=99;
if n=3 then pred:=999;
if n=4 then pred:=9999;
if n=5 then pred:=32767;

if n=1 then nach:=1;
if n=2 then nach:=10;
if n=3 then nach:=100;
if n=4 then nach:=1000;
if n=5 then nach:=10000;

delitel:=10;

for i:=nach to pred do;
begin
while delitel>=10000 do;
	begin
	qwer:=pred/delitel;
	temp:=trunc(qwer);
	sum:=sum+temp;
	delitel:=delitel+10;
	end;
if sum=k then writeln('tststrewer',i)
end;
end.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Мы не ищем легких путей, мы ищем изящные :)
[syntax='Delphi']

const k=...;
n=...;

function pow10(n: byte): longint;
var i: byte;
begin pow10:=1; for i:=1 to n do pow10:=pow10*10; end;

var sum,j: byte; i, count: longint;
begin
sum:=1; //У любого наименьшего n-значного числа сумма цифр всегда 1.
count:=0;
for i:=pow10(n) to pow10(n+1)-1 do begin
for j:=n-1 downto 1
if i mod pow10(j)=0 then begin dec(sum, 9*j-1); break; end;
if i mod 10<>0 then inc(sum);
if sum=k then inc(count);
end;
writeln(count);
end.
[/syntax]
Как это работает: обычно при переходе к следующему числу сумма цифр увеличивается на 1, но если мы переходим на новую десятку, то последняя девятка становится нулем, а цифра десяток увеличивается на 1, т.е. сумма уменьшается на 9 и увеличивается на 1. Соответственно, если мы переходим через сотню, то две девятки становятся нулями и увеличивается на 1 число сотен, и т.д.
Код писался на коленке, компилировать не пробовал.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
brouken
Сообщения: 23
Зарегистрирован: 18 май 2008, 13:14

Благодарю, ошибку понял, всё исправлено.
Ответить