Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2015, 21:55   #1
a_clarke
 
Регистрация: 10.10.2015
Сообщений: 4
По умолчанию Pascal ABCNET. Найти сколько зёрен поместится на шахматной доске и их вес

Шахматы были изобретены в Индии. Индусский царь Ше-рам решил наградить изобретателя шахмат, вызвал его к себе и сказал,что исполнит любую его просьбу. Изобретатель удивил царя беспримерной скромностью просьбы:
-Прикажи выдать мне за первую клетку шахматной доски 1 пшеничное зерно, за вторую 2, за каждую следующую в два раза больше, чем за предыдущую. Сколько килограммов зерен было выдано изобретателю, если 1 зерно весит 0.05 г.
a_clarke вне форума Ответить с цитированием
Старый 11.10.2015, 22:16   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А как на бумаге решить знаешь?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.10.2015, 09:38   #3
a_clarke
 
Регистрация: 10.10.2015
Сообщений: 4
По умолчанию

да,знаю. а с кодом не получается
a_clarke вне форума Ответить с цитированием
Старый 12.10.2015, 10:52   #4
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Код:
zern:=0;
zernKl:=1;
for i:=1 to 64 do 
 begin
      zernKl:=zernKl*2; // зерен в клетке 
      zern:=zern+ zernKl; //всего зерен. 
 end;
так??
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 12.10.2015, 15:20   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Та ладно, там длинная арифметика нужна - 2^64 - 1 = 18446744073709551615
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.10.2015, 18:54   #6
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Та ладно, там длинная арифметика нужна - 2^64 - 1 = 18446744073709551615
http://www.borlpasc.narod.ru/refer/2/tip.htm

2*10^63-1 должно хватить
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 12.10.2015, 19:39   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Это про int64 или его аналог? Ну так подставь в свой код, облом получишь
И кг будет 922337203685477,58075
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 12.10.2015 в 20:03.
Аватар вне форума Ответить с цитированием
Старый 13.10.2015, 11:44   #8
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

а так ?? если честно не уверен что скомпилируется даже..
Код:


type 
mas = array[1..8] of Integer;
 
var 
zern,
zernKl:mas;
i:byte;

procedure umnog(Mnog:integer; a1:mas;); // умножение
var
	prom:integer;
 begin
	prom:=0;	
	for n:=8 downto 1 do 
	 begin
		a1[n]:=(a1[n]*Mnog)+prom ;
		if a1[n] > 999 then 
		 begin
			prom:=(a1[n] div 1000) ;
			a1[n]:=(a1[n] mod 1000);  
		 end;
	 end;
 for i:=1 to 8 do  
	zernKl[i]:=a1[i];
 end;

procedure summ(a1:mas;a2:mas;);  // сумирование
var
	prom:integer;
 Begin 
	prom:=0;	
	for n:=8 downto 1 do 
	 begin
		a1[n]:=(a1[n]+a2[n])+prom ;
		if a1[n] > 999 then 
		 begin
			prom:=(a1[n] div 1000) ;
			a1[n]:=(a1[n] mod 1000);  
		 end;
	 end;
 for i:=1 to 8 do  
	zern[i]:=a1[i];
 end;

Begin
zernKl[8]:=1;
zern[8]:=0;
 for i:=1 to 64 do 
  begin
    umnog(2,zernKl);// зерен в клетке 
	summ (zern,zernKl);//всего зерен.  
  end;
..................
end.
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 13.10.2015, 15:17   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

взяв код для длинной арифметики любезно предоставленный Mad_Cat в этом сообщении - (ссылка)
можно получить такой (рабочий код):

Код:
function CharToByte(c: char): byte;
begin
  CharToByte := ord(c) - ord('0');
end;

function BytetoChar(c: byte): char;
begin
  BytetoChar := chr(c + ord('0'));
end;

function Summa(x, y: string): string;
var i: integer;
  summ: byte;
  res: string;
begin
  res := '';
  while length(x) < length(y) do
    x := '0' + x;
  while length(y) < length(x) do
    y := '0' + y;
  for i := 1 to length(x) do
    res := res + '0';
  for i := length(x) downto 2 do
  begin
    summ := CharToByte(x[i]) + CharToByte(y[i]) + CharToByte(res[i]);
    res[i] := bytetochar(summ mod 10);
    res[i - 1] := bytetochar(summ div 10);
  end;
  summ := CharToByte(x[1]) + CharToByte(y[1]) + CharToByte(res[1]);
  if summ <= 9 then
    res[1] := bytetochar(summ)
  else begin
    res[1] := bytetochar(summ mod 10);
    res := bytetochar(summ div 10) + res;
  end;
  summa := res;
end;

function MultDigit(x, y: string): string;
var i: integer;
  Mult: byte;
  res: string;
begin
  res := '';
  for i := 1 to length(x) do
    res := res + '0';
  for i := length(x) downto 2 do
  begin
    Mult := CharToByte(x[i]) * CharToByte(y[1]) + CharToByte(res[i]);
    res[i] := bytetochar(Mult mod 10);
    res[i - 1] := bytetochar(Mult div 10);
  end;
  mult := CharToByte(x[1]) * CharToByte(y[1]) + CharToByte(res[1]);
  if mult <= 9 then
    res[1] := bytetochar(mult)
  else begin
    res[1] := bytetochar(mult mod 10);
    res := bytetochar(mult div 10) + res;
  end;
  MultDigit := res;
end;

function MultNumb(x, y: string): string;
var i: integer;
  Mult: byte;
  res: string;
  buf: string;
  tmp: string;
begin
  res := '';
  buf := '';
  for i := length(y) downto 1 do
  begin
    tmp := Multdigit(x, y[i]) + buf;
    res := summa(res, tmp);
    buf := buf + '0';
  end;
  MultNumb := res;
end;

var zernKl: uint64;
 i:integer;
 AllZeren, allVes : string;
 sZernKl  : string;
begin
 AllZeren:='1';
 zernKl:=1; // учли уже первую клетку
 for i:=2 to 64 do 
 begin
    zernKl:=zernKl*2; // зерен в клетке 
    str(zernKl, sZernKl);
    AllZeren:=Summa(AllZeren, sZernKl); //всего зерен. 
    // WriteLn('2^',i,'=',zernKl, ' i2s = ',sZernKl,' сумма равна ',AllZeren );
 end;
 // '5' вес зерен будем считать в целых числах, 0.05 гр. - это 5 сотых грамма }
 WriteLn('Всего зерен  =', AllZeren  );
 allVes := MultNumb(AllZeren, '5');
 WriteLn('Вес зерен в сотых грамма =', allVes  );
 Insert('.', allVes, Length(allVes)+1-5); // разделим на 100000 (поставим запятую на пять знаков правее)
 WriteLn('Вес зерен в кг =  ', allVes); 
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal ABC. Установить на шахматной доске минимум ферзей (первоначально 8), чтобы каждое поле было под боем pyxamex Паскаль, Turbo Pascal, PascalABC.NET 0 29.05.2014 13:57
Ладья на шахматной доске C++ VIGANTI Помощь студентам 2 09.10.2012 20:15
Си/Си++ Слоны на шахматной доске Маришка_Курносова Помощь студентам 1 12.09.2010 01:02
Найти расстановку восьми слонов на шахматной доске WhiteKuz Общие вопросы Delphi 1 30.04.2010 12:25