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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2011, 00:45   #11
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Сообщение от pproger
последний элемент 2^63, ибо на первую клетку кладем одно зерно - 2^0
Ну да, логично)
Цитата:
Сообщение от pproger
в long int уже не влезет 2^32
Ну, в плюсах вроде бы размер сильно зависит от процессора, а значит может теоретически попасться проц в котором long int - 8 байт
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 16.07.2011, 00:45   #12
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
умножать на 2 проще всего битовыми сдвигами
у меня в дизассемблере генерится идентично, как для i = i<<1, так i=i*2.
EUGY вне форума Ответить с цитированием
Старый 16.07.2011, 00:47   #13
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Сообщение от EUGY
как для i = i<<1, так i=i*2.
В какой-то теме критиковали статью про оптимизацию, и, в частности, кто-то указал что компилятор умножение/деление на степень двойки заменяет сдвигами.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 16.07.2011, 00:50   #14
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Ну да, логично)

Ну, в плюсах вроде бы размер сильно зависит от процессора, а значит может теоретически попасться проц в котором long int - 8 байт
Вам же сказали - в 32-битной архитектуре.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 16.07.2011, 00:54   #15
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Сообщение от Blade
Вам же сказали - в 32-битной архитектуре.
Уже после того, как я сказал, что не влезет)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 16.07.2011, 08:34   #16
_Aptem_
 
Регистрация: 15.07.2011
Сообщений: 6
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
для "местного магараджи" чисто "индусский" код
Код:
	const double VESZ = 0.000032; 
	double mass[64];
	double sum = 1.0;
	for (int i = 1; i<64; i++)
	    sum += mass[i] = 2*mass[i-1];
	sum = sum * VESZ;
Ну это просто... с одномерными массивами я разобрался а вот с двумерными есть неясности... потому и в задачке именно двумерный взял...


Поправил исходник вроде построение без ошибок проходит.... а в консоле все равно в результате 0

Код:
#include <iostream>

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

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

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

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

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

long double 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;
			}


        if (j > 0) {

  massive [i][j] = (2 * massive[i][j-1]); // если предыдущий элемент в той же строке
}  
		else

								 {

  massive[i][j] = (2 * massive[i-1][STOLBEC-1]); // если предыдущий элемент - последний в предыдущей строке

};


				  }
				  }



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

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

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

		                       }

	                               }


obshiy_ves = VES_ZERNISHKA * summa;

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

cin.get();
return 0;

	}
подозреваю что что-то с типами даных перемудрил... может вразумит кто ?

Последний раз редактировалось _Aptem_; 16.07.2011 в 09:36.
_Aptem_ вне форума Ответить с цитированием
Старый 16.07.2011, 10:59   #17
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Ну, даже если двухмерный массив непременное условие, то все равно можно ведь покороче:
Код:
const double VESZ = 0.000032; 
const int COLS = 8, ROWS = 8;
double mass[ROWS][COLS] = {1};
double sum = 1.0;
for (int i = 0, c = 0, r = -1; i < ROWS * COLS; i++, c = i % COLS ) {
    r += c ? 0 : 1;
    if (c || r)
        sum += mass[r][c] = 2 * (c ? mass[r][c - 1] : mass[r - 1][COLS - 1]);
}
sum = sum * VESZ;
В long long int у тебя на последней итерации переполнение.
Используй просто double, подумаешь погрешность во втором знаке..
EUGY вне форума Ответить с цитированием
Старый 16.07.2011, 11:48   #18
_Aptem_
 
Регистрация: 15.07.2011
Сообщений: 6
По умолчанию

а... теперь дошло, или вернее почти дошло. не совсем и в моем "сложном" и более упрощеном варианте результат выдает 3.2е - 006... это означает ошибку в програме или еще нужно как-то преобразовывать выдо конечного результата ... например через printf("count %d" ) ?
_Aptem_ вне форума Ответить с цитированием
Старый 16.07.2011, 11:59   #19
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

printf("%.2f",sum); //590295810358705.62
Но точное значение (если я не ошибся) должно быть таким 590295810358705,651712
EUGY вне форума Ответить с цитированием
Старый 16.07.2011, 12:04   #20
_Aptem_
 
Регистрация: 15.07.2011
Сообщений: 6
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
printf("%.2f",sum); //590295810358705.62
Но точное значение (если я не ошибся) должно быть таким 590295810358705,651712

Спасибо большое

и еще такой вопрос немного не в тему а можно ли сделать так что бы конечный результат принимал более читабельную форму ... ну к примеру выходит у нас в результате 1000000 - а в консоле чтобы выдавало 1 000 000, т.е. сделать разделитель групп разрядов ?

Последний раз редактировалось _Aptem_; 16.07.2011 в 12:08.
_Aptem_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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