Технический форум
Вернуться   Технический форум > Программирование > Форум программистов


Ответ
 
Опции темы Опции просмотра
Старый 04.11.2015, 08:43   #11 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Олег, +100500!

Да все задачи вполне решаемые, сложность решения заложена только в самой формулировке задачи, специально путают.
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием

Старый 04.11.2015, 08:43
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Иногда для успешного решения проблемы стоит лишь обратить внимание на схожие топики

Паскальчик, задачки
Кто решит задачки?
Три задачки
Две задачки, массивы
Задачки на Pascal

Старый 04.11.2015, 10:53   #12 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Mr Kejik Посмотреть сообщение
А вообще, если хотите, ради интереса можете попробовать сделать 4-ую задачу
Ах Вы, змей-искусАтель!
Ну ладно, уж не знаю, через что, но у меня получилось так (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.
Программа "переваривает" числа длиной до 255 цифр.
На всякий случай: смысл последнего ветвления в том, чтобы обработать число, состоящее из одних девяток. В этом случае нужно последнюю девятку заменить шестёркой.
Применена рекурсивная процедура вычисления цифрового корня.
Vladimir_S вне форума   Ответить с цитированием
Старый 05.11.2015, 19:34   #13 (permalink)
Mr Kejik
Новичок
 
Регистрация: 01.11.2015
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
На всякий случай: смысл последнего ветвления в том, чтобы обработать число, состоящее из одних девяток. В этом случае нужно последнюю девятку заменить шестёркой.
В тестах программу проверяли на числа не только из одних девяток, но также и из одних восьмерок - там тоже нужно понизить последнюю циферку

Ваша программа через получение строки работает?
Просто я так и не дошел - какой тип целого числа может "выдержать" 100-значное неотрицательное число (нужно около 512 байт)
Погуглим...
Mr Kejik вне форума   Ответить с цитированием
Старый 05.11.2015, 19:39   #14 (permalink)
Mr Kejik
Новичок
 
Регистрация: 01.11.2015
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Ах Вы, змей-искусАтель!
Ну ладно, уж не знаю, через что, но у меня получилось так
Спасибо большое за поддержку
Я тут занимаюсь еще изучением верстки сайтов - на свою страничку вставлю этот код - на память
Mr Kejik вне форума   Ответить с цитированием
Старый 05.11.2015, 19:44   #15 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Mr Kejik Посмотреть сообщение
В тестах программу проверяли на числа не только из одних девяток, но также и из одних восьмерок - там тоже нужно понизить последнюю циферку
Да... не учел.
Цитата:
Сообщение от Mr Kejik Посмотреть сообщение
Ваша программа через получение строки работает?
Конечно.
Цитата:
Сообщение от Mr Kejik Посмотреть сообщение
Просто я так и не дошел - какой тип целого числа может "выдержать" 100-значное неотрицательное число (нужно около 512 байт) Погуглим...
Сколь мне известно, такого типа в природе не существует. Например, некоторые виды (не все!) ЯП Паскаль-семейства поддерживают 20-значные числа (8 байт), но это всего лишь до 18446744073709551615. Так что мне кажется, что остаются только строки.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 05.11.2015, 19:46   #16 (permalink)
Mr Kejik
Новичок
 
Регистрация: 01.11.2015
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Так что мне кажется, что остаются только строки
Поэтому я так и сделал

Возможно чуть позже выложу свой вариант, переписанный на Паскаль с С++
Mr Kejik вне форума   Ответить с цитированием
Старый 05.11.2015, 20:01   #17 (permalink)
Vladimir_S
Специалист
 
Регистрация: 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.
Vladimir_S вне форума   Ответить с цитированием
Старый 05.11.2015, 20:18   #18 (permalink)
navy4ok
Member
 
Регистрация: 26.10.2015
Сообщений: 144
Сказал(а) спасибо: 9
Поблагодарили 3 раз(а) в 2 сообщениях
Репутация: 2085
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
всего лишь до 18446744073709551615
Владимир Игоревич, я немножко баловался ассемблером )))
Цитата:
dt — резервирование памяти для данных размером 10 байт.
Директивой dt можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для МП i8086:
для чисел со знаком –32 768...+32 767;
для чисел без знака 0...65 535;
для МП i386 и выше:
для чисел со знаком –2 147 483 648...+2 147 483 647;
для чисел без знака 0...4 294 967 295;
относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей);
адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;
константу со знаком из диапазона –279...279-1;
константу без знака из диапазона 0...280-1;
строку длиной до 10 байт, заключенную в кавычки;
упакованную десятичную константу в диапазоне 0...99 999 999 999 999 999 999.
Отсюда.
navy4ok вне форума   Ответить с цитированием
Старый 05.11.2015, 20:25   #19 (permalink)
Mr Kejik
Новичок
 
Регистрация: 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.
Mr Kejik вне форума   Ответить с цитированием
Старый 05.11.2015, 20:27   #20 (permalink)
Mr Kejik
Новичок
 
Регистрация: 01.11.2015
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от navy4ok Посмотреть сообщение
Владимир Игоревич, я немножко баловался ассемблером )))
Ого, я ассемблер не осилю пока ))
И все-таки не сможет С++ 100-разрядное число выдержать
Mr Kejik вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Метки
олимпиада, простейшие задачи, просто поговорить, с++


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 08:14.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.