Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2015, 19:04   #1
AB96
Пользователь
 
Регистрация: 20.10.2015
Сообщений: 22
По умолчанию Делится ли введённое число n на 15

Здравствуйте! В общем, у меня такая ситуация, я могу получить автомат за экзамен по C. Осталось решить три задания. Два решил, с одним заданием возникли сложности. Условие задания: Число n вводится своим двоичным представлением (длина числа не превышает 100 двоичных разрядов). Необходимо определить делится ли введённое число n на 15. Прошу Вас, помогите! Заранее спасибо!
AB96 вне форума Ответить с цитированием
Старый 14.12.2015, 19:09   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Задание прекрасно
Переводите в 16-те ричную и смотрите на остаток от деления на 15 суммы
Poma][a вне форума Ответить с цитированием
Старый 14.12.2015, 19:25   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Наверно без длиной арифметики не обойтись, преобразуя в массив десятичных цифр. А потом если сумма цифр делится на 3 и последняя 0 или 5, то делится на 15
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.12.2015, 19:38   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Ну неее.
Ей Богу так работает.. Помните вы меня учили доказывать что число делится на 9 если сумма цифр делится на 9? Тут точно также. Число K в системе счисления с основанием N будет делиться на N-1 тогда и только тогда, когда сумма цифр делится на N-1

А у нас в 2. Переводим в 16 заменяя тетрады
Poma][a вне форума Ответить с цитированием
Старый 14.12.2015, 19:46   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Наверно. А еще вспомнил, что есть признаки делимости двоичного числа на 3 и 5. Только их найти нужно. Этого тоже достаточно будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.12.2015, 20:43   #6
AB96
Пользователь
 
Регистрация: 20.10.2015
Сообщений: 22
По умолчанию

Что-то не очень понял...

Это, наверное, неверно?

Код:

#include <stdio.h>
#define MAX 100

int main()
{
    int bin[MAX], i, nym, x = 0, sum = 0, z=0;
    for (i = 0; i < MAX; ++i) 
	{
        nym = getchar() - '0';
        if (nym == 0 || nym == 1)
		{
            *(bin + i) = nym;
		}
        else
		{
            break;
		}
    }
    while (--i >= 0) 
	{
        nym = 1;        
        for (int z = 1; z <= i; ++z)
		{
			nym *= 2;
		}

        nym *= *(bin + x++);
        sum += nym;
    }

    if (sum % 15)
	{
        printf("%d / 15 No\n", sum);
	}
    else
	{
        printf("%d / 15 Yes\n", sum);
	}
    return 0;
}

Последний раз редактировалось Stilet; 14.12.2015 в 22:38.
AB96 вне форума Ответить с цитированием
Старый 14.12.2015, 21:36   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

не..
Предлагаю так. Заполняем массив 0\1 с конца. В какой-то момент получили массив длины K. До тех пор - пока K%4 != 0 добавляем 0 в конец массива. Как только закончили - идем по 4-кам (с начала -с конца - пофигу). Четыре 0\1 преобразуем в 16-ричное число. И прибавляем его к sum. В конце все зависит от sum%15
Poma][a вне форума Ответить с цитированием
Старый 15.12.2015, 09:55   #8
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Число делится на 15, если оно делится на 3 и на 5. В десятичном представлении признак делимости на 3 - делимость суммы цифр на 3, многозначная сумма цифр проверяется по тому же признаку, а среди однозначных делятся: 3, 6 и 9. Признак же делимости на 5 - окончание записи числа на 0, или на 5. Но в двоичном не знаю.

Нашёл. Если знакопеременная сумма цифр числа делится на число, на 1 большее основания, то и само число делится на число, на 1 большее основания. В двоичной системе по этому признаку можно проверить делимость на 3, а в четвертичной - на 5, при этом перевод в из двоичной системы в четвертичную не требует фактического преобразования, так как смешанная двоично-четвертичная эквивалентна двоичной, то есть просто сгруппируй биты по два и получишь двоичную запись четвертичных цифр и складывай их, как числа с чередованием знака. При получении суммы с более чем двумя значащими цифрами делимость проверяется рекурсивно, то есть делимость знакопеременной суммы цифр проверятся по тому же самому признаку, что и делимость самого числа. Если число делится на 3 и на 5, значит оно делится на 15.

Последний раз редактировалось Stilet; 15.12.2015 в 10:57.
taras-proger вне форума Ответить с цитированием
Старый 15.12.2015, 11:12   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Poma][a, а зачем так сложно то?

Тут же уже неоднократно предлагали простейший алгоритм
вводим строку.
Если длина строчки меньше двух - выход с сообщением, что число НЕ ДЕЛИТСЯ на 15
Если длина строки равна двум - перевод строки в число, проверяем остаток от деления на 15 - если он равен нулю - число ДЕЛИТСЯ на 15, иначе, если остаток не равен нулю - число НЕ ДЕЛИТСЯ на 15
Если длина строки больше двух:
находим сумму всех цифр строки.
если сумма_всех_цифр_строки делится на 3 и последнюю цифра строки равна 0 или 5 - тогда ДЕЛИТСЯ на 15
иначе - число НЕ ДЕЛИТСЯ на 15

всё.

в коде это будет короче, чем я тут расписывал!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.12.2015, 11:26   #10
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

1. Сколько времени уйдёт на парсинг записи числа, для которого нужны 100 бит? А я парсить не предлагаю.
2. Сколько времени уйдёт на деление стабитного числа? А сколько на 50 инкрементов и 50 декрементов в цикле?
3. Какова сложность парсинга записи числа, для которого нужны 100 бит? А я парсить не предлагаю.
4. Какова сложность реализации длинного деления? А какова сложность использования готовых инкремента и декремента и реализации простейшего цикла?
Строка как раз не дана, а дано стобитное число, которое ещё перевести надо в строчную форму.
5. Сколько времени уйдёт на перевод стабитного числа в строчную форму? А я ничего переводить в строчную форму не предлагаю.
6. Какова сложность реализации перевода стабитного числа в строчную форму? А я ничего переводить в строчную форму не предлагаю.
Так что Ваш алгоритм монструозен, а мой примитивен.

Последний раз редактировалось taras-proger; 15.12.2015 в 11:37.
taras-proger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерный массив, находится ли в двумерном массиве введённое с клавиатуры число (Delphi 7) Юля_7182 Помощь студентам 22 26.05.2014 17:36
Даны натуральные K и L. Определить, делится ли K нацело на L. Если делится, то заменить эти числа их квадратами, в противном случ Proskurina Помощь студентам 1 27.03.2013 21:39
Как разделить введённое n значное число на отдельны цифры? mig-29 Общие вопросы C/C++ 5 22.05.2009 16:30
Ввести число N и определить делится ли оно без остатка на число M (VBA) Ivanich Microsoft Office Excel 7 24.04.2008 19:43
Как разделить введённое n значное число на отдельны цифры? mig-29 Помощь студентам 13 04.04.2008 20:01