04.11.2015, 08:43 | #11 (permalink) |
support
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
|
Да все задачи вполне решаемые, сложность решения заложена только в самой формулировке задачи, специально путают.
__________________
Убить всех человеков! |
04.11.2015, 08:43 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Иногда для успешного решения проблемы стоит лишь обратить внимание на схожие топики Паскальчик, задачки Кто решит задачки? Три задачки Две задачки, массивы Задачки на Pascal |
04.11.2015, 10:53 | #12 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Ну ладно, уж не знаю, через что, но у меня получилось так (Free Pascal) : Код:
Var S,S1,Dig_S,Dig_S1:String; DR,Code,DD:Word; i,k,Dig:Byte; b:boolean; Procedure DigitalRoot(Sd:String; var Sr:String; var D:Word); var P:Word; L,j,m:Byte; begin L:=Length(Sd); P:=0; for j:=1 to L do begin Val(Sd[j],m,Code); Inc(P,m); end; STR(P,Sr); D:=P; if P>=10 then DigitalRoot(Sr,Sr,D); end; Begin Writeln('Enter the number (up to 255 digits):'); Readln(S); DigitalRoot(S,S1,DR); b:=false; i:=0; Repeat Inc(i); Val(S[i],Dig,Code); k:=10; repeat Dec(k); STR(DR+k,Dig_S); DigitalRoot(Dig_S,Dig_S1,DD); until ((Dig+k<10) and ((DD mod 3)=0)) or (k=1); if ((Dig+k<10) and ((DD mod 3)=0)) then begin b:=true; Dig:=Dig+k; end; Until b or (i=Length(S)); if b then begin S1:=''; for k:=1 to i-1 do S1:=S1+S[k]; STR(Dig,Dig_S); S1:=S1+Dig_S; for k:=i+1 to Length(S) do S1:=S1+S[k]; end else begin S1:=''; for k:=1 to Length(S)-1 do S1:=S1+S[k]; S1:=S1+'6'; end; Writeln('Result:'); Writeln(S1); Readln End. На всякий случай: смысл последнего ветвления в том, чтобы обработать число, состоящее из одних девяток. В этом случае нужно последнюю девятку заменить шестёркой. Применена рекурсивная процедура вычисления цифрового корня. |
|
05.11.2015, 19:34 | #13 (permalink) | |
Новичок
Регистрация: 01.11.2015
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
Ваша программа через получение строки работает? Просто я так и не дошел - какой тип целого числа может "выдержать" 100-значное неотрицательное число (нужно около 512 байт) Погуглим... |
|
05.11.2015, 19:44 | #15 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
05.11.2015, 20:01 | #17 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Исправил. Теперь и восьмерки отрабатывает:
Код:
Var S,S1,S2,Dig_S,Dig_S1:String; DR,Code,DD:Word; i,k,Dig:Byte; b:boolean; Procedure DigitalRoot(Sd:String; var Sr:String; var D:Word); var P:Word; L,j,m:Byte; begin L:=Length(Sd); P:=0; for j:=1 to L do begin Val(Sd[j],m,Code); Inc(P,m); end; STR(P,Sr); D:=P; if P>=10 then DigitalRoot(Sr,Sr,D); end; Begin Writeln('Enter the number (up to 255 digits):'); Readln(S); DigitalRoot(S,S1,DR); b:=false; i:=0; Repeat Inc(i); Val(S[i],Dig,Code); k:=10; repeat Dec(k); STR(DR+k,Dig_S); DigitalRoot(Dig_S,Dig_S1,DD); until ((Dig+k<10) and ((DD mod 3)=0)) or (k=1); if ((Dig+k<10) and ((DD mod 3)=0)) then begin b:=true; Dig:=Dig+k; end; Until b or (i=Length(S)); if b then begin S1:=''; for k:=1 to i-1 do S1:=S1+S[k]; STR(Dig,Dig_S); S1:=S1+Dig_S; for k:=i+1 to Length(S) do S1:=S1+S[k]; end else begin S1:=''; for k:=1 to Length(S)-1 do S1:=S1+S[k]; DigitalRoot(S1,S2,DR); Val(S[Length(S)],Dig,Code); repeat Dec(Dig); until ((DR+Dig) mod 3)=0; STR(Dig,Dig_S); S1:=S1+Dig_S; end; Writeln('Result:'); Writeln(S1); Readln End. |
05.11.2015, 20:18 | #18 (permalink) | |
Member
Регистрация: 26.10.2015
Сообщений: 144
Сказал(а) спасибо: 9
Поблагодарили 3 раз(а) в 2 сообщениях
Репутация: 2085
|
Владимир Игоревич, я немножко баловался ассемблером )))
Цитата:
|
|
05.11.2015, 20:25 | #19 (permalink) |
Новичок
Регистрация: 01.11.2015
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Вот мой С++ код, переписанный на Паскаль
Код:
var number : string; sum, ost, i, err, digit : integer; got : boolean; Begin readln(number); for i := 1 to length(number) do begin Val(number[i], digit, err); sum := sum + digit; end; ost := 3 - (sum mod 3); got := false; for i := 1 to length(number) do begin Val(number[i], digit, err); if (digit <= 9-ost) and (not got) then begin got := true; digit := digit + ost; while digit <= 6 do digit := digit + 3; write(digit); end else begin if (i = length(number)) and (not got) then begin got := true; digit := digit - ost; write(digit); end else write(digit); end; end; End. |
05.11.2015, 20:27 | #20 (permalink) |
Новичок
Регистрация: 01.11.2015
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Метки |
олимпиада, простейшие задачи, просто поговорить, с++ |
|
|