Как проверить на подразделение 7 для большого количества в C++?

static string ToCsv<T>(IEnumerable<T> things, Func<T, string> toStringMethod)
{
    StringBuilder sb = new StringBuilder();

    foreach (T thing in things)
        sb.Append(toStringMethod(thing)).Append(',');

    return sb.ToString(0, sb.Length - 1); //remove trailing ,
}

Использование как это:

DataTable dt = ...; //datatable with some data
Console.WriteLine(ToCsv(dt.Rows, row => row["ColName"]));

или:

List<Customer> customers = ...; //assume Customer has a Name property
Console.WriteLine(ToCsv(customers, c => c.Name));

у меня нет компилятора для вручения, но в теории он должен работать. И как все знают в теории, практика и теория являются тем же. На практике они не.

5
задан Tim 26 September 2012 в 03:34
поделиться

6 ответов

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

18
ответ дан 18 December 2019 в 05:12
поделиться

вы можете использовать известное правило о делении на 7, который говорит: сгруппируйте каждые 3 цифры вместе, начиная справа, и начните вычитать и складывать их поочередно, делимость результата на 7 такая же, как и у исходного числа:

Пример:

testing 341234612736481253489125349812643761283458123548213541273468213
        549821354182354891623458917245921834593218645921580

   (580-921+645-218+593-834+921-245+917-458+623-891+354-182
    +354-821+549-213+468-273+541-213+548-123+458-283+761-643
    +812-349+125-489+253-481+736-612+234-341 
    = 1882 )
    % 7 != 0 --> NOK!

есть другие альтернативы этому правилу, все легко реализовать.

26
ответ дан 18 December 2019 в 05:12
поделиться

Большинство правил деления на семь работают на уровне цифр, поэтому у вас не должно возникнуть проблем с их применением к вашей строке.

13
ответ дан 18 December 2019 в 05:12
поделиться

Вы можете вычислить значение числа по модулю 7.

То есть для каждой цифры d и значения n на данный момент вычислить n = (10 * n + d)% 7.

Это имеет то преимущество, что работает независимо от делителя 7 или основания 10.

3
ответ дан 18 December 2019 в 05:12
поделиться

Я бы начал с вычитания большого числа, которое делится на 7.

Примеры чисел, которые делятся на 7, включают 700, 7000, 70000, 140000000, 42000000000 и т. Д.

В конкретном примере, который вы дали, попробуйте вычесть 280000000000 (некоторое количество нулей) 0000.

Еще проще реализовать, многократно вычтите максимально возможное число, например 70000000000 (некоторое количество нулей) 0000.

1
ответ дан 18 December 2019 в 05:12
поделиться

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

Если бы у вас было меньшее число, скажем 123 , как бы вы получили ] 1 , 2 и 3 из него? Тем более что вы работаете по базе 10 ...

0
ответ дан 18 December 2019 в 05:12
поделиться
Другие вопросы по тегам:

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