Перейти к содержанию
    

комбинаторика

Подскажите, как бы вы решили задачку.

Дано: 6 резисторов номиналами 1-2-4-6-8-10 кОм.

Резисторы соединены параллельно через ключи.

Как найти "быстро " все возможные номиналы общего сопротивления.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, messenger сказал:

как бы вы решили задачку.

я бы нашел магические числа степеней 2-ки, их 4 шт.

2^4  всего то 16 значений линейно нарастающей проводимости.

к этим 16 значениям дописываем строку еще из 16 увеличенных на 1/6 (0,166666)  значений  и еще строку увеличенных на 1/10=0,1 

ну и последнюю строку увеличенных на 0,266666

Всего 4 строки по 16 чисел. в самом конце брать обратные значения чтоб килоомы нарисовались.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

64 варианта. в экселе сначала копируем в 6 столбцов все проводимости. потом руками обнуляем перебирая двоичный код. в 7 столбце складываем сумму первых 6 столбцов. в 8 находим обратную величину - сопротивление.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, Самурай сказал:

R = 1./sum(repmat(1./r,63,1).*i,2)

Да. Конечно через проводимости. Но думаю принцип понятен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, firstvald said:

64 варианта. в экселе сначала копируем в 6 столбцов все проводимости. потом руками обнуляем перебирая двоичный код. в 7 столбце складываем сумму первых 6 столбцов. в 8 находим обратную величину - сопротивление.

Мне этот вариант показался самым простым. Прав ли я?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 5/3/2024 at 1:18 PM, messenger said:

Мне этот вариант показался самым простым. Прав ли я?

Нет, конечно.. :)

Spoiler
#include "stdafx.h"

double R[] = {1.0,2.0,4.0,6.0,8.0,10.0};

int _tmain(int argc, _TCHAR* argv[])
{
    FILE *pFile;

    fopen_s(&pFile,"..\\Resist.txt","w+");

    double Conduct,Resist;

    for (int i = 1; i < 64; i++)
    {
        Conduct = 0.0;

        for (int j = 0; j < 6; j++) if ((i >> j) & 1) Conduct += 1.0/R[j]; 

        Resist = 1.0/Conduct;

        fprintf(pFile,"%g\n",Resist);
    }

    fclose(pFile);

    return 0;
}

 

Spoiler
Quote

1
2
0.666667
4
0.8
1.33333
0.571429
6
0.857143
1.5
0.6
2.4
0.705882
1.09091
0.521739
8
0.888889
1.6
0.615385
2.66667
0.727273
1.14286
0.533333
3.42857
0.774194
1.26316
0.55814
1.84615
0.648649
0.96
0.489796
10
0.909091
1.66667
0.625
2.85714
0.740741
1.17647
0.540541
3.75
0.789474
1.30435
0.566038
1.93548
0.659341
0.983607
0.495868
4.44444
0.816327
1.37931
0.57971
2.10526
0.677966
1.02564
0.506329
2.55319
0.718563
1.1215
0.528634
1.55844
0.609137
0.875912
0.466926
 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 минуты назад, messenger сказал:

Прав ли я?

Перебирать руками двоичный код - не царское дело, к тому же долго.  В экселе несколько раз протянуть мышкой с нажатым Ctrl. 

 

image.thumb.png.77e7c2575f55a8ddb244e81a6ad656e9.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

49 minutes ago, messenger said:

Мне этот вариант показался самым простым. Прав ли я?

да. никаких инструментов не надо. только половину часа посидеть.

              Проводимость Сопротивление
  1 2 4 6 8 10    
  1 0.5 0.25 0.166667 0.125 0.1    
#                
0 0 0 0 0 0 0 0 #ДЕЛ/0!
1 1 0 0 0 0 0 1 1
2 0 0.5 0 0 0 0 0.5 2
3 1 0.5 0 0 0 0 1.5 0.666666667
4 0 0 0.25 0 0 0 0.25 4
5 1 0 0.25 0 0 0 1.25 0.8
6 0 0.5 0.25 0 0 0 0.75 1.333333333
7 1 0.5 0.25 0 0 0 1.75 0.571428571
                 
63 1 0.5 0.25 0.166667 0.125 0.1 2.041667 0.489795838

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, firstvald сказал:

только половину часа посидеть

а может ему 

 

В 02.05.2024 в 22:43, messenger сказал:

Как найти "быстро " все

надо быстрее , например секунд за 50 :hi:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое Всем спасибо! Уже пишу код с этими расчетами. Мне понравилось по старинке через двоичный код. 

Как раз будет два массива, один в виде 0b другой с соответствующими сопротивлениями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...