Задачки для разминки. (Простенькие такие...)

Модератор: Модераторы разделов

Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: Задачки для разминки.

Сообщение Olej » 08.02.2016 18:27

Olej писал(а):
29.01.2016 13:47
№1 : Известно, что правильная рациональная дробь N / M ( N < M ) в десятичной записи может давать либо конечную запись ( 2 / 5 = 0.4 ), либо периодическую запись ( 1 / 3 = 0.(3) ). Рациональная дробь не может производить иррациональное значение (с непериодической десятичной записью, как, например, SQRT( 2 ) ). Создайте программу преобразования рациональной дроби в позиционную запись. Примите во внимание, что период может начинаться не с 1-й цифры после запятой: 1 / 12 = 0.08(3). Чтобы задача не казалась слишком лёгкой, сделайте её для произвольной системы счисления, основание которой (не только 10) вводится как отдельный параметр, например в 2-чной системе 2 / 3 = 0.(10) = 1 * ½ + 0 * ¼ + ...

Код: Выделить всё

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

inline char simb( unsigned val ) {
   return val < 10 ? '0' + val : 'A' + val - 10;
}

unsigned input( char *msg ) {
   int i;
   unsigned ret = 0;
   printf( "%s", msg );
   fflush( stdout );
   if( ( i = scanf( "%u", &ret ) ) <= 0 || ret <= 0 ) {
      printf( "ошибка ввода\n" );
      exit( 1 );
   }
   return ret;
}

void show( int n, unsigned ost, unsigned arr[] ) { // только для отладки:
   unsigned i;
   printf( "%3u -> {[%d]: ", ost, n );
   for( i = 0; i < n && arr[ i ] >= 0; i++ )
      printf( "%u ", arr[ i ] );
   printf( "}\n" );
};

int main( int argc, char **argv ) {
   int i, j, debug = ( argc > 1 &&
                       ( 0 == strcmp( argv[ 1 ], "-v" ) ||
                         0 == strcmp( argv[ 1 ], "debug" ) ) );
   while( 1 ) {
      unsigned metr, ch, zn;
      metr = input( "система счисления: " );
      ch = input( "числитель: " );
      zn = input( "знаменатель: " );
      if( ch >= zn ) {
         printf( "должнв быть правльная дробь!\n" );
         continue;
      }
      char *sval = (char*)calloc( zn + 1, sizeof( char ) );
      unsigned *list = (unsigned*)calloc( zn, sizeof( unsigned ) );
      for( i = 0; i < zn; i++ ) list[ i ] = -1;
      unsigned ost = ch;                    // остаток от деления
      for( i = 0; ; i++, ost *= metr ) {
         if( i > 0 ) sval[ i - 1 ] = simb( ost / zn );
         ost %= zn;
         if( debug ) show( i, ost, list );
         if( 0 == ost ) break;
         for( j = 0; j < i; j++ )
            if( ost == list[ j ] ) break;   // найден совпадающий остаток
         if( i == 0 || j == i )
            list[ i ] = ost;
         else {
            ost = i - j;
            break;
         }
      }
      sval[ i ] = '\0';
      free( list );
      char *sres = (char*)calloc( strlen( sval ) + 4, sizeof( char ) );
      strcpy( sres, "0." );
      i = strlen( sval ) - ost;
      strncpy( sres + strlen( sres ), sval, i );
      if( ost > 0 ) {
         strcat( sres, "(" );
         strcat( sres, sval + i );
         strcat( sres, ")" );
      }
      printf( "длина периода %u : %u / %u = %s\n", ost, ch, zn, sres );
      free( sval );
      free( sres );
   }
   return 0;
}

Если с отладкой, чтобы видеть как это происходит:

Код: Выделить всё

$ ./period1 debug
система счисления: 10
числитель: 11
знаменатель: 13
 11 -> {[0]: }
  6 -> {[1]: 11 }
  8 -> {[2]: 11 6 }
  2 -> {[3]: 11 6 8 }
  7 -> {[4]: 11 6 8 2 }
  5 -> {[5]: 11 6 8 2 7 }
 11 -> {[6]: 11 6 8 2 7 5 }
длина периода 6 : 11 / 13 = 0.(846153)

Если без (в конечном виде) + несколко результатовв качестве тестовых данных, если кому-то будет интересно улучшить и сравнить код:

Код: Выделить всё

$ ./period1
система счисления: 2
числитель: 17
знаменатель: 47
длина периода 23 : 17 / 47 = 0.(01011100100110001000001)
система счисления: 8
числитель: 53
знаменатель: 59
длина периода 58 : 53 / 59 = 0.(7137352234150105330745756511606404255436276724470320212661)
система счисления: 10
числитель: 283
знаменатель: 293
длина периода 146 : 283 / 293 = 0.(96587030716723549488054607508532423208191126279863481228668941979522184300341296928327645051194539249146757679180887372013651877133105802047781569)



Спасибо сказали:

gavrasio
Сообщения: 109
ОС: Mageia 4

Re: Задачки для разминки.

Сообщение gavrasio » 01.03.2016 20:05

MUTOgen писал(а):
23.09.2008 00:55
/dev/random писал(а):
23.09.2008 00:47
MUTOgen писал(а):
23.09.2008 00:10
y=pow(2,2-x)?

))) это два действия. Проще надо, проще.

быть может блеснете? :ph34r:

Спасибо сказали:

Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: Задачки для разминки.

Сообщение Olej » 01.03.2016 20:44

gavrasio писал(а):
01.03.2016 20:05
MUTOgen писал(а):
23.09.2008 00:55
/dev/random писал(а):
23.09.2008 00:47
MUTOgen писал(а):
23.09.2008 00:10
y=pow(2,2-x)?

))) это два действия. Проще надо, проще.

быть может блеснете? :ph34r:


А чем это вас так ... возбудил эпизод в диалоге 8-летней давности? ... там и не все его участники, возможно, живы до сих пор, чтобы ответить за свои сова :unsure:

Код: Выделить всё

y = 3 ^ x;


Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 14129
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Задачки для разминки.

Сообщение Bizdelnick » 01.03.2016 21:19

Да там, вообще-то, был дан ответ (кстати, немного другой).
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

gavrasio
Сообщения: 109
ОС: Mageia 4

Re: Задачки для разминки.

Сообщение gavrasio » 01.03.2016 22:20

MUTOgen писал(а):
23.09.2008 00:55
/dev/random писал(а):
23.09.2008 00:47
MUTOgen писал(а):
23.09.2008 00:10
y=pow(2,2-x)?

))) это два действия. Проще надо, проще.

быть может блеснете? :ph34r:

Эта задача( без МП) имеет очень множественное представления, допустим х*х-у*у=5, и так далее в любой степени.
Спасибо сказали:

gavrasio
Сообщения: 109
ОС: Mageia 4

Re: Задачки для разминки.

Сообщение gavrasio » 01.03.2016 22:27

/dev/random писал(а):
23.09.2008 01:17
MUTOgen писал(а):
23.09.2008 00:55
быть может блеснете? :ph34r:

y=3-x, конечно )))

А вот ещё задачка. Надеюсь, не дубль. Есть две целочисленные переменные. Не вводя третьей, обменять их значения. 3 действия.

х*х -у*у=5. В любой степени.
Спасибо сказали:

Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: Задачки для разминки.

Сообщение Olej » 01.03.2016 22:29

gavrasio писал(а):
01.03.2016 22:20
Эта задача( без МП) имеет очень множественное представления, допустим х*х+у*у=5, и так далее в любой степени.

Кто такой МП? :unsure:

Это как в давнем анекдоте:
Дети в школе пишут диктант. Учительница диктует:
- В углу скребёт мышь ... ... Вовочка! ты почему не пишешь?
- Я не понимаю кто такой Скр !


Вот тут получается такой же разговор. :angry:
Спасибо сказали:

gavrasio
Сообщения: 109
ОС: Mageia 4

Re: Задачки для разминки.

Сообщение gavrasio » 01.03.2016 22:35

Olej писал(а):
01.03.2016 22:29
gavrasio писал(а):
01.03.2016 22:20
Эта задача( без МП) имеет очень множественное представления, допустим х*х+у*у=5, и так далее в любой степени.

Кто такой МП? :unsure:
:

Микропоц.
Спасибо сказали:

gavrasio
Сообщения: 109
ОС: Mageia 4

Re: Задачки для разминки.

Сообщение gavrasio » 01.03.2016 23:15

gavrasio писал(а):
01.03.2016 22:35
Olej писал(а):
01.03.2016 22:29
gavrasio писал(а):
01.03.2016 22:20
Эта задача( без МП) имеет очень множественное представления, допустим х*х+у*у=5, и так далее в любой степени.

Кто такой МП? :unsure:
:

Микропоц.

полность отьехал.
х+у=3
Х*Х+У*У=5
х*х*х+у*у*у=9 и т.д.
Спасибо сказали:

gavrasio
Сообщения: 109
ОС: Mageia 4

Re: Задачки для разминки.

Сообщение gavrasio » 02.03.2016 14:26

Olej писал(а):
01.03.2016 20:44

Код: Выделить всё

y = 3 ^ x;

Есть ещё варианты! Но, кто-то затянится на них? Или через 8-мь лет мне опять писать?
Спасибо сказали:

gavrasio
Сообщения: 109
ОС: Mageia 4

Re: Задачки для разминки.

Сообщение gavrasio » 02.03.2016 14:54

Данное уравнение имеет на декартовой плоскости множественное решение. Кто покажет?!!!
Спасибо сказали:

Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: Задачки для разминки.

Сообщение Olej » 02.03.2016 15:07

gavrasio писал(а):
02.03.2016 14:54
Данное уравнение имеет на декартовой плоскости множественное решение. Кто покажет?!!!

Не интересно это. К вопросам программирования это не имеет никакого касательств.а.

P.S. И потом непонятно вообще о каком "уравнении" идёт речь? Показан оператор языка C, в частности, оператор присвоения. А никаких таких уравнений ни в языках программирования, ни в практике программирования, нет и не будет. Всё конкретно, просто и ясно...
А если это просто хочется поговорить ... о кроссвордах и головоломках - так это лучше на другие форумы, а ещё лучше - в социальные сети :2: : там ждут не дождутся! :1a:
Спасибо сказали:

gavrasio
Сообщения: 109
ОС: Mageia 4

Re: Задачки для разминки.

Сообщение gavrasio » 02.03.2016 15:26

gavrasio писал(а):
02.03.2016 14:54
Данное уравнение имеет на декартовой плоскости множественное решение. Кто покажет?!!!

Будем жать восемь лет.
Спасибо сказали:

Аватара пользователя
Tema
Сообщения: 96
ОС: Debian testing

Re: Задачки для разминки.

Сообщение Tema » 19.02.2018 17:06

Привет, товарищ поделился заданием с собеседования:
https://pastebin.com/Ww7Zm8JQ

Почему выводит 10 1 1 ?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 14129
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Задачки для разминки.

Сообщение Bizdelnick » 19.02.2018 17:47

BOSS писал(а):
19.02.2018 17:06
Почему выводит 10 1 1 ?

Было бы странно, если бы вывело что-то другое. Меня больше интересует, почему на собеседованиях дают такие нечитаемые задания, да ещё с

Код: Выделить всё

#include <stdio.h>
, и зачем так по-уродски форматируют вывод.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Вернуться в «Программирование для начинающих»