Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > двумерный массив


Автор: sasha11 9.10.2007, 17:13
эх, целый день бьюсь об экран головой, задача такая.. создать двумерный массив[10][10], чтобы каждый последущий элемент был в 2 раза больше предыдущего...
ужос, всё что только мог.. перепробывал, нуждаюсь в помощи. 
int t,i,num[10][10];
for(t=0;t<10;++t){
for(i=0;i<10;++i){
num[t][i]=(t*10)+i+1;

StringGrid1->Cells[i][t]=num[t][i];//вывожу результат через компонент Builder C++, в принципе не важно.
}
}

Автор: _Michael 9.10.2007, 17:30
 smile а ты знаеш такую задачу об изобретателе шахмат? что индийскому радже так игра понравилась что он сказал етому изобретателю что выполнит любое его желание. ну и тот сказал дай мне столько зерна чтоб на первой клетке одно зернышко, на второй два, на третьей 4, на четвертой  8,  и так по всей доске.? Ты представляеш какое ето огромное число? попробуй сначала на бумаге подсчитать приблизително. ето доска 8х8 шахматная. а тебе надо 10х10. Ето или арифметику больших чисел использовать или не знаю как еще. 
Но в чем проблема собственно? что-то из поста непонятно

Автор: sasha11 9.10.2007, 17:37
нда, наверно в задачнике опечатка, там написананно каждое следущее число в два рааз больше предыдущего..., типа 1 2 4 8 16 32 64 и.т.д. 
хех, я так долго парился.., ну а если массив 5x5 или хотябы 3х3, мне уже очень интересно не решить.. а узнать способ решения.. ???

Автор: _Michael 9.10.2007, 17:42
способ решения чего? 
как умножать числа на два? и присваивать их елементам массива? smile

Автор: sasha11 9.10.2007, 17:45
не... как умножать все элементы на два я знаю, но мне надо чтобы каждый елемент был в два раза больше предыдущего, хотябы массива 3х3.. 
типа 1 2 4
         8 16 32
         64 128 256

Автор: Fazil6 9.10.2007, 17:46
Код

#include <iostream>

const int col = 10;
const int row = 10;

long double num[row][col];

int main(int argc, char *argv[])
{
    num[0][0] = 1;
    long double *p = *num;
    for(int i = 1; i < row*col ; ++i)
    {
        long double tmp = *p;
        ++p;
        *p = tmp * 2;
    }

    for(int i = 0; i < row; ++i)
    {
        for(int q = 0 ; q < col ; ++q)
            std::cout << num[i][q] << " ";

        std::cout << "\n";
    }
}

Автор: sasha11 9.10.2007, 17:50
УХ !!! спасибо, теперь буду сидеть разбирать !!!

Автор: _Michael 9.10.2007, 17:59
Fazil6, long double может уместить в себе такие большие числа? Если размер етого типа 8 байт то максимальное число 2^64-1 можно уместить. 

Автор: mr.Anderson 9.10.2007, 18:09
Вариант на паскале (язык все равно не указан smile ). Написано в Delphi 2007, ниже вариант без дельфинских вставок.
Код

//проект из Delphi 2007
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
 arr  : Array [0..3, 0..3] of Integer;
 i, j : Integer;

begin
  try
   arr[0][0] := 1;

   for i:=0 to 3 do
    for j:=1 to 3 do
    begin
     arr[i,j] := arr[i,j-1]*2;

     if( j = 3 ) and ( i < 3 ) then
      arr[i+1,0] := arr[i,j]*2;
    end;

   for i:=0 to 3 do
    for j:=0 to 3 do
     writeln( arr[i,j] );

   readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.

Код

//вариант без дельфинских вставок, чистый Паскаль

program Project1;

var
 arr  : Array [0..3, 0..3] of Integer;
 i, j : Integer;

begin
 arr[0][0] := 1;

 for i:=0 to 3 do
  for j:=1 to 3 do
  begin
   arr[i,j] := arr[i,j-1]*2;

   if( j = 3 ) and ( i < 3 ) then
    arr[i+1,0] := arr[i,j]*2;
  end;

 for i:=0 to 3 do
  for j:=0 to 3 do
   writeln( arr[i,j] );

 readln;
end.

Автор: DjoNIK 9.10.2007, 23:05
mr.Anderson, а ничего, что форум по общим вопросам C++ smile

Автор: Fazil6 9.10.2007, 23:15
Цитата(_Michael @  9.10.2007,  17:59 Найти цитируемый пост)
Fazil6, long double может уместить в себе такие большие числа? Если размер етого типа 8 байт то максимальное число 2^64-1 можно уместить. 

не путать с целыми

Автор: marcusmae 9.10.2007, 23:37
Цитата(_Michael @  9.10.2007,  17:30 Найти цитируемый пост)
индийскому радже так игра понравилась что он сказал етому изобретателю что выполнит любое его желание. ну и тот сказал дай мне столько зерна чтоб на первой клетке одно зернышко, на второй два, на третьей 4, на четвертой  8,  и так по всей доске.? Ты представляеш какое ето огромное число?


Хитрый раджа предложил изобретателю самому считать зёрнышки. Так что, за всю свою жизнь он немного насчитал. Отсюда мораль : сначала надо было изобрести вычислительные машины  smile 

Автор: 0lmer 15.10.2007, 10:25
Цитата(sasha11 @  9.10.2007,  17:13 Найти цитируемый пост)

int t,i,num[10][10];
for(t=0;t<10;++t)
{for(i=0;i<10;++i)
{num[t][i]=(t*10)+i+1;


по моему получится массив
1   2   3   4 5 6 7 8 9 10
10 12 13... и т. д.

насчет влезет ли число в long double не знаю, но где то в инете видел класс
который представляет числа в виде строки , туда в принципе можно спокойно 300-400 значные числа запихивать.

Автор: ksili 15.10.2007, 11:30
я не понял, почему именно двумерный массив? По-моему вы его всё равно заполняете линейно. А вот если бы было так:

1    2    4    8
2    4    8   16
4    8   16  32
8   16  32  64

Добавлено через 1 минуту и 31 секунду
long double вмещает максимум примерно 10^4932

Автор: _Michael 16.10.2007, 08:29
Цитата(0lmer @  15.10.2007,  10:25 Найти цитируемый пост)
где то в инете видел класс
который представляет числа в виде строки , туда в принципе можно спокойно 300-400 значные числа запихивать.

ето и есть арифметика больших чисел, операции над ними тоже иначе реализованы, не можно ж например просто сложыть две строки как два числа, надо реализовать метод который будет посимвольно их обрабатывать.smile

Автор: zhgutov 17.10.2007, 14:31
long double вмещает максимум примерно 10^4932
В экспоненциальной форме. Количество десятичных разрядов будет ограничено примерно 17 знаками. А нужно 31! 2^100 = 1267650600228229401496703205376)) При использовании double получится что-то вроде 1267650600228229400000000000000. Тут либо использовать 128-битную целочисленную арифметику, либо реализовать свой класс.

Добавлено @ 14:39
Если не извращаться:
Код

#include <cstdio>

typedef int Integer;

const int WIDTH = 4;
const int HEIGHT = 4;

int main ()
{
    Integer values [WIDTH][HEIGHT], temp = 1;

    for (int y = 0; y < HEIGHT; ++y)
    {
        for (int x = 0; x < WIDTH; ++x)
        {
            values [x][y] = temp;
            printf ("%d ", temp); // Или как-то иначе...
            temp *= 2;
        }
        printf ("\n");
    }
}

Автор: zhgutov 17.10.2007, 15:07
А если по приколу, то без использования строк можно использовать что-то типа этого:
Код

unsigned mul (unsigned arg1, unsigned arg2, unsigned* high_ptr)
{
    unsigned _low, _high;
    _asm
    {
        mov    eax, arg1
        mov    ebx, arg2
        mul    ebx
        mov    _low, eax
        mov    _high, edx
    }
    if (high_ptr)
    {
        *high_ptr = _high;
    }
    return _low;
}

А дальше — как в столбик...

Автор: akizelokro 19.10.2007, 07:12
Цитата

Тут либо использовать 128-битную целочисленную арифметику, либо реализовать свой класс.

Либо скачать библиотеку HIME для работы с huge integers

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)