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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2011, 21:09   #1
_Aptem_
 
Регистрация: 15.07.2011
Сообщений: 6
По умолчанию Задача про зерно

Здравствуйте, я пока новичок в C++ (менее недели изучаю), для тренировки пытаюсь решить задачу про зернышки на шахматной доске : если на первую клетку шахматной доски положить 1 зернышко, на вторую в два раза больше и т.д. до конца.

Так вот вроде все более менее понятно но возникла сложность с заполнением двумерного массива, ни как не могу сообразить каким образом сделать так чтобы каждое последующее значение было вдвое больше предыдущего…

И отказаться от решения тоже не могу… самому интересно… )))

Код:

#include <iostream>

#include <clocale>                 //для настроек локали

using namespace std; 
const int STROKA = 8, STOLBEC = 8;     //константы для размера двумерного массива

const double VES_ZERNISHKA = 0.000032;  //примерный вес одного зернышка, в тоннах

int i, j;

long int massive [STROKA][STOLBEC];  //объявление двумерного массива 

long int summa, obshiy_ves;          // переменная для подсчета суумы всех элементов массива

int main () {

setlocale (LC_ALL, "Russian_Russia.1251"); // настройка отображения русских букв в окне консоли

	for (i = 0; i != STROKA; ++i) {

		for (j = 0; j != STOLBEC; ++j) {

//-----------------------------------------------------------------------------------------
	
			if (i == 0 && j == 0) {       // т.к. самый первый элемент массива по условию равен 1
				massive [i][j] = 1;
			}

			else  {                         // ???? тут описания условия при котором каждый
				                            // последующий элемент в двое больше предыдущего

			}
				                   }
		                           }
//-------------------------------------------------------------------------------------
for (i = 0; i != STROKA; ++i) {

		for (j = 0; j != STOLBEC; ++j) {

		summa += massive [i][j];                 //подсчет суммы элементов массива

		                       }
		                               }
obshiy_ves = VES_ZERNISHKA * summa;               //определение общего веса, исходя из кол - ва зернышек

cout << "Общий вес =  " << obshiy_ves;

		}

Последний раз редактировалось _Aptem_; 15.07.2011 в 21:48.
_Aptem_ вне форума Ответить с цитированием
Старый 15.07.2011, 22:07   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Ну внутренний цикл у Вас проходит по элементам строки, от этого и идем.
Код:
if(j>0){
  massive[i][j] = 2*massive[i][j-1]; // если предыдущий элемент в той же строке
}else{
  massive[i][j] = 2*massive[i-1][STOLBEC-1]; // если предыдущий элемент - последний в предыдущей строке
};
Кстати, интересно, а в чем суть задачи? Именно заполнить массив и сосчитать? Потому что можно сразу по ходу в цикле считать общий вес. А еще можно сразу вывести ее формулу)
Кстати, последний элемент = 2^64, а это уже не влезет в long int, а сумма тем более.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 15.07.2011, 22:19   #3
_Aptem_
 
Регистрация: 15.07.2011
Сообщений: 6
По умолчанию

Спасибо больше за ответ...

насчет типов переменных, это я знаю просто пока временно присвол первое подвернувшееся...

Суть задачи в том что была такая легенда. Когда изобритатель шахмат "подарил" свое изобретение местному магарадже, то тот спросил что он (изобретатель) хочет в награду.

Ну изобретатель и озвучил условия задачи... мол на первую клеточку одно зернышко на каждую последующую в два раза больше... это он так пошутил ...
_Aptem_ вне форума Ответить с цитированием
Старый 15.07.2011, 22:20   #4
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Granus
Цитата:
Кстати, последний элемент = 2^64
последний элемент 2^63, ибо на первую клетку кладем одно зерно - 2^0

Цитата:
а это уже не влезет в long int
в long int уже не влезет 2^32, ибо long int в x86 (32 бита) - 4 байта. 8 байт можно положить в long long int
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 15.07.2011 в 22:23.
pproger вне форума Ответить с цитированием
Старый 15.07.2011, 22:33   #5
_Aptem_
 
Регистрация: 15.07.2011
Сообщений: 6
По умолчанию

странно... где то я еще ошибся. Типы подправил а в консоле результат все равно равен 0...
_Aptem_ вне форума Ответить с цитированием
Старый 15.07.2011, 22:52   #6
-LeV-
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 29
По умолчанию

умножать на 2 проще всего битовыми сдвигами
Код:
long long int i = 1;
i = i<<1; // i = 2;
i = i<<1; // i = 4;
-LeV- вне форума Ответить с цитированием
Старый 15.07.2011, 22:53   #7
-LeV-
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 29
По умолчанию

умножать на 2 проще всего битовыми сдвигами
Код:
long long int i = 1;
i = i<<1; // i = 2;
i = i<<1; // i = 4;
-LeV- вне форума Ответить с цитированием
Старый 15.07.2011, 23:47   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

для "местного магараджи" чисто "индусский" код
Код:
	const double VESZ = 0.000032; 
	double mass[64]= {1};
	double sum = 1.0;
	for (int i = 1; i<64; i++)
	    sum += mass[i] = 2*mass[i-1];
	sum = sum * VESZ;
EUGY вне форума Ответить с цитированием
Старый 16.07.2011, 00:20   #9
danzel1
Пользователь
 
Регистрация: 15.03.2011
Сообщений: 61
По умолчанию

у тебя функция main() ничего не возвращает
danzel1 вне форума Ответить с цитированием
Старый 16.07.2011, 00:32   #10
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от -LeV- Посмотреть сообщение
умножать на 2 проще всего битовыми сдвигами
Мне одному кажется что это ужасная фраза? \


Цитата:
Сообщение от danzel1 Посмотреть сообщение
у тебя функция main() ничего не возвращает
Функция main() по умолчанию вернет 0, если не указано другое
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача про рыбалку Dj Troy Паскаль, Turbo Pascal, PascalABC.NET 8 06.04.2011 08:53
задача про строки morgan97 Паскаль, Turbo Pascal, PascalABC.NET 3 09.02.2011 21:58
ЗАДАЧА ПРО КИНОТЕАТР NatawaB Паскаль, Turbo Pascal, PascalABC.NET 3 10.01.2011 20:09
задача про множества любаша Общие вопросы Delphi 2 16.09.2010 19:08
Задача про 3 прямые meds Паскаль, Turbo Pascal, PascalABC.NET 5 17.11.2008 12:24