Подробное учебное руководство на структурах в [закрытом] C

Вы можете использовать itertools.product:

import itertools
remaining_order = 13
package_numbers = [9,5,3]
required_packages = []
a=min([x for i in range(1,remaining_order+1//min(package_numbers)) for x in itertools.product(package_numbers,repeat=i)],key=lambda x: abs(sum(x)-remaining_order))
remaining_order-=sum(a)
print(a)
print(remaining_order)

Выход:

(5, 5, 3)
0

Это просто делает следующие шаги:

  1. Получить значение, ближайшее к 13, в списке со всеми значениями произведения.

  2. Затем просто заставьте его изменить число remaining_order.

Если вы хотите, чтобы он выводился с 'x':

import itertools
from collections import Counter
remaining_order = 13
package_numbers = [9,5,3]
required_packages = []
a=min([x for i in range(1,remaining_order+1//min(package_numbers)) for x in itertools.product(package_numbers,repeat=i)],key=lambda x: abs(sum(x)-remaining_order))
remaining_order-=sum(a)
print(' '.join(['{0}x{1}'.format(v,k) for k,v in Counter(a).items()]))
print(remaining_order)

Вывод:

2x5 + 1x3
0
6
задан John Saunders 16 July 2013 в 00:24
поделиться

6 ответов

Можно всегда читать Учебное руководство Brian W. Kernighan, которое довольно хорошо. Что касается "детали", что точно Вы имеете в виду? Структуры довольно просты, в конце концов. Вышеупомянутая ссылка охватывает проблемы, с которыми обычно встречаются, определения типов, указатели на структуру, и т.д. Если Вы все еще не ясны на структурах, возможно, необходимо попытаться отправить некоторые более конкретные вопросы.

8
ответ дан 8 December 2019 в 13:03
поделиться

Одна вещь иметь в виду со структурами в C (не C++) состоит в том, что необходимо использовать структуру слова при объявлении их как так:

struct Point location;

Из-за этого Вы будете часто видеть их объявленный с определением типа как это:

typedef struct tagPoint {
    int x;
    int y;
    } Point;

Затем можно объявить точку, поскольку Вы были бы другие типы:

Point location;

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

5
ответ дан 8 December 2019 в 13:03
поделиться

Я обычно совет (и всегда рекомендовался) использовать официальные руководства. Для случая ANSI C Вы не может больше детализироваться и чиновник, чем K&R2.

3
ответ дан 8 December 2019 в 13:03
поделиться

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

Иллюстрация:

struct foo {
  int a;
  int b;
};
  • Имена переменной в структуре называют участниками.

Править:

Член структуры упоминается как:

structure_variable.member
structure_pointer->member
(*structure_pointer).member    // Fiddly; use -> instead

Например:

struct foo test;
struct foo *ptr = &test;
test.a = 1;
ptr->b = 2;

Можно сделать другие вещи, такие как:

  • Указатели на структуры
  • Массивы структур

Примечание:

  • Если структура является довольно большой, более эффективно передать указатель на структуру вместо самой структуры

Замечательная книга: C Язык программирования, 2-й Выпуск (программное обеспечение Prentice Hall)

  • Превосходное введение в структуры
1
ответ дан 8 December 2019 в 13:03
поделиться

Как другие уже сказали, структура является просто группировкой переменных. В зависимости от Вашей цели Вы, возможно, должны были бы принять во внимание дополнение или упаковку, если Вы хотите получить доступ к элементам через функции низкого уровня (f.e. с адресной арифметикой с указателями): элементы структуры обычно выровненные на 4-байтовых границах (на 32 битах). Таким образом структуре, которая включает элементы другого размера, возможно, понадобилось бы дополнение

struct foo {
    int a;
    char b;
    int c;
    char d;
}

В этом примере (предполагающий, что интервал составляет 4 байта и символ, который 1 байт и ЦП выравнивает на границах на 32 бита) Вам нужны 3 дополнительных Байта после b выровнять структуру. В этом случае может быть более эффективно отсортировать структуру по-другому. Обратите внимание, что это не изменит его использование, поскольку это не изменяет имена элемента. Не всем процессорам нужны участники структуры, чтобы быть выровненные, но использование упакованных элементов структуры, которые оставили бы некоторое свободное место, может привести к штрафу скорости. В большинстве случаев Вы не должны волноваться об этом все же.

Что касается определений типов вокруг структуры, можно даже использовать то же название определения типа и структуры, т.е. чего-то вроде этого:

typedef struct foo {
  int a;
  int b;
} foo;

Это позволяет использовать

struct foo variable;

или

foo variable;

для объявления переменной типа struct foo.

От моего typdef-луга точки зрения структура является плохой идеей, поскольку это скрывает информацию что определение типа (как foo) структура и запись ключевого слова struct не действительно дополнительная работа (особенно, если те определения типов получают постфикс, добавленный для указания на них являющийся структурой - я видел это довольно часто).

Править: добавленные пропавшие без вести typedef во втором примере.

1
ответ дан 8 December 2019 в 13:03
поделиться

Проверьте книгу Алгоритмы в C от Sedgewick. Там Вы видение довольно большого количества различных Datastructues на работе. Другое интересное чтение является Моделью Gobject от gtk +. Поскольку там они создают инфраструктуру для объектно-ориентированного программирования в C, это - чрезвычайно много обработки Datastructure. Другой вещью, стоящей взгляда, является модель COM, которую можно перевести в одну структуру C с определенным расположением. Бойкое содержит тонны полезного datastructures, как делает, например, libapr или libnspr.

Вы можете проверить почти любой язык "сценариев" и будете видеть "datastructures на работе" ;-)

Отношения Friedrich

0
ответ дан 8 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: