Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Ildan
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 10
#1

Определить, делится ли это число на 15 - C++

26.11.2013, 15:15. Просмотров 1610. Ответов 32
Метки нет (Все метки)

"Пользователь вводит двоичное число. Нужно определить делится ли это число на 15."
Я написал программу которая переводит двоичное число в десятичное и делит на 15.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "Russian");
    cout << "Введите двоичное число(длина числа не превышает 10000 двоичных разрядов)" << endl;
    string s;  
    cin>>s;
    int n=0;
    for(int i=s.length()-1;i>=0;i--) 
    {
        if(s[s.length()-i-1]=='1')  
            n=n+pow(2.0,i); 
    }
    if(n%15==0)
        cout<<"Делится";
    else
        cout<<"Не делится";
    system ("Pause>>void");
}
Но загвоздка заключается в том, что мне после проверки выполненной работы, поставили условие: что введенное двоичное число не должно переводится в десятичную СС, а программа должна сразу проверять делится оно на 15 или нет. Т.е. если пользователь вводит, например 1110102(3010) и это число надо разделить на 11112(1510)
Есть ли в С++ возможность, работать с двоичными числами или все намного сложнее. Помогите с этим вопросом, пожалуйста! В С++ я новичок и сам не смог разобраться=(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2013, 15:15     Определить, делится ли это число на 15
Посмотрите здесь:

Определить, делится ли на три введенное с клавиатуры целое число C++
C++ Дано целое число N. Найдите все такие целые числа d, что N делится на d2 и не делится на d3.
C++ Число делится на 11, если разность между суммой цифр на четных и нечетных местах делится на 11
Определить, делится ли число на 4 без остатка C++
C++ Дано натуральное четырехзначное число n. Определить, является ли это число перевертышем
C++ перевод строки в число, определить делится ли оно на 4
C++ Проверить гипотезу: если сумма цифр числа делится на 3, то и само число делится на 3
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ildan
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 10
27.11.2013, 15:34  [ТС]     Определить, делится ли это число на 15 #21
ya_noob,
Цитата Сообщение от ya_noob Посмотреть сообщение
так чему равно x ?
Я уже совсем запутался, объясните, пожалуйста, все по порядку, что я должен делать, если вас это не затруднит. Я в тупике(
ValeryS
Модератор
6512 / 4978 / 460
Регистрация: 14.02.2011
Сообщений: 16,486
27.11.2013, 15:38     Определить, делится ли это число на 15 #22
ну вот накропал
создал из кусков
ввод ввел строкой чтобы тупо не вбивать все разряды


тестируйте


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
 
// функция проверки числа 
// если больше или равно 15 вернет 1
//если равно 0 вернет 0
//если меньше 15 вернет -1 
int verify15(int * arr,int size)
{
 int summ=0;
 for(int i=size-1;i>3;i--)
     summ|=arr[i];
if(summ!=0)
 return 1;
summ=1;
 for(int i=0;i<4;i++)
     summ&=arr[i];
if(summ==1)
 return 1;
summ=0;
 for(int i=0;i<4;i++)
     summ|=arr[i];
if(summ==0)
 return 0;
 
 
return -1;
}
 
int main()
{
     const int sz=100;//размер числа, количество разрядов 
    int arrNumber[sz];
    int arrDiv[4]={1,1,1,1};
    setlocale (LC_ALL, "Russian");
 
while(1)
{
    cout << "Введите двоичное число(длина числа не превышает 100 двоичных разрядов)" << endl;
    string s;  
    cin>>s;
    int n=0;
    for( int i=0;i<sz;i++) 
    {
        arrNumber[i]=0;
        
    }  
 
 
   for( int i=0;i<s.length();i++) 
    {
        arrNumber[s.length()-1-i]=s[i]-0x30;
        
    }
    
    for(int i=sz-1;i>=0;i--) 
    {
        cout<<arrNumber[i];
        
    }
  while(verify15(arrNumber,sz)==1) 
  {
  for( int i=0;i<4;i++) //цикл для разрядов
 {
  arrNumber[i]-=arrDiv[i];// вычитаем 
  if( arrNumber[i]==-1) // если число отрицательное значит идет заем
   {
      arrNumber[i]&=0x01;// переводим в положительное 
     for(int j=i+1;j<sz;j++) // цикл для заема
      {
        arrNumber[j]--;  // вычитаем 1 из следующего разряда, заем
         if(arrNumber[j]>-1) // если результат положительный 
             break;  // то дальше идти не надо выходим из цикла 
         arrNumber[j]&=0x01;// делаем число положительным 
     
       }    
   } 
 }
  
 
  
  }
    cout<<endl;
  if(verify15( arrNumber,sz)==0)
        cout<<"Делится";
    else
        cout<<"Не делится";
 cout<<endl;
}  
  system ("Pause>>void");
}
Ildan
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 10
27.11.2013, 15:48  [ТС]     Определить, делится ли это число на 15 #23
ValeryS, Спасибо Вам огромное!!все работает правильно. только в ответе выдает очень длинное число типа "0000000000000001111" но это не важно)Вы спасли меня от мучений сессии)
zzzvolk
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 11
27.11.2013, 15:52     Определить, делится ли это число на 15 #24
узнаем делиться число 47 на 15
Х=47
Д=0
Д=Х нет
Д>Х нет Д<X да то
Д=0+15
Д=Х нет
Д>Х нет Д<X да то
Д= 15+15
Д=Х нет
Д>Х нет Д<X да то
Д=30+15
Д=Х нет
Д>Х нет Д<X да то
Д=45+15
Д=Х нет
Д>Х да
(число не делиться на 15)

Добавлено через 2 минуты
Цитата Сообщение от zzzvolk Посмотреть сообщение
узнаем делиться число 47 на 15
Х=47
Д=0
Д=Х нет
Д>Х нет Д<X да то
Д=0+15
Д=Х нет
Д>Х нет Д<X да то
Д= 15+15
Д=Х нет
Д>Х нет Д<X да то
Д=30+15
Д=Х нет
Д>Х нет Д<X да то
Д=45+15
Д=Х нет
Д>Х да
(число не делиться на 15)
лучше через рекурсию писать
ValeryS
Модератор
6512 / 4978 / 460
Регистрация: 14.02.2011
Сообщений: 16,486
27.11.2013, 16:00     Определить, делится ли это число на 15 #25
zzzvolk,
проблема то не в том что бы проверить можно разделить или нельзя
а в том что С не поддерживает двоичных значений
следовательно число должно быть или в массиве или в строке
и для этого представления надо создать арифметику
Цитата Сообщение от Ildan Посмотреть сообщение
только в ответе выдает очень длинное число типа "0000000000000001111" но это не важно)
это проверка числа, что правильно ввел, можешь выбросить, показывает все разряды
если бы ты ввел как хотел 10000 разрядов вообще бы одни 0 увидел
там еще бесконечный цикл чтобы можно было не одно число проверить а несколько
тоже не есть гут
Ildan
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 10
27.11.2013, 16:08  [ТС]     Определить, делится ли это число на 15 #26
ValeryS, да ладно, оставлю. все равно проверяют только с бумаги(на компе его проверять не будут). осталось только понять по пунктам, что делает программа. Еще раз большое спасибо!
ya_noob
_
201 / 145 / 9
Регистрация: 08.10.2011
Сообщений: 432
27.11.2013, 16:30     Определить, делится ли это число на 15 #27
ValeryS, назовите максимальное число, которое ваша программа может проверить за разумное время (хотя бы примерно).
Lynxsmr
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 3
27.11.2013, 16:54     Определить, делится ли это число на 15 #28
Так, возможно, несколько короче:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
 
int lengh(int x){
    int l=0;
    for(int i=1;x/i>0;i*=10,l++);
    return l;
}
 
int power(int x, int y){
    int r=x;
    if(y<=0)
        r=1;
    for(y--;y>0;y--)
        r*=x;
    return r;
}
 
int dig(int x, int n){
    return x-x%power(10,n-1)-(x/power(10,n))*power(10,n);
}
 
int sub(int a, int b){
    int c=a;
    for(int j=0;j<lengh(b);j++){
        c-=dig(b,j+1);
        int i=lengh(c), d=c;
        for(;i>0;i--){
            if(d/power(10,i-1)==9)
                c-=8*power(10,i-1);
            d=d%power(10,i-1);
            }
    }
    return c;   
}
 
int binmod(int a, int b){
    if (a<b) return a;
    else binmod(sub(a,b), b);
}
 
bool f(int x){
    return (binmod(x,1111)==0);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int x;
    std::cin>>x;
    std::cout<<f(x);    
    return 0;
}
ValeryS
Модератор
6512 / 4978 / 460
Регистрация: 14.02.2011
Сообщений: 16,486
27.11.2013, 17:05     Определить, делится ли это число на 15 #29
Цитата Сообщение от ya_noob Посмотреть сообщение
ValeryS, назовите максимальное число, которое ваша программа может проверить за разумное время (хотя бы примерно).
а я что утверждал что это самая быстрая программа?
нет конечно это самое тупое решение
но и самое очевидное
конечно здесь нужна теория
самое первое что приходит в голову это то что 15=5*3
признак деления на 5 это в конце 0 или 5
а признак деления на 3 это сумма всех разрядов делится на 3
значит признак делимости на 15 это сумма должна делится на 3 и оканчиваться на 5 или 0
в качестве оправдания могу сказать что второе слабое место здесь человек, сколько времени он будет вбивать
100 значное число

Добавлено через 5 минут
Lynxsmr,
а где у тебя двоичное число???
только не надо говорить что все числа в компе двоичные, это я и так знаю
У ТС другая проблема
Цитата Сообщение от Ildan Посмотреть сообщение
Но загвоздка заключается в том, что мне после проверки выполненной работы, поставили условие: что введенное двоичное число не должно переводится в десятичную СС,
следовательно нужно сначала придумать представление числа
а потом уже к нему пришпандоривать арифметику
я вот предложил массив, согласен не самый лучший способ, но просто лежит на поверхности
Lynxsmr
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 3
27.11.2013, 17:14     Определить, делится ли это число на 15 #30
Цитата Сообщение от ValeryS Посмотреть сообщение
Lynxsmr,
а где у тебя двоичное число???
Цитата Сообщение от ValeryS Посмотреть сообщение
следовательно нужно сначала придумать представление числа
Можно ведь представить его не только в виде массива, но и в виде int с 0 и 1.
В идеале, правда, нужно сделать проверку при вводе, но вряд ли это существенно.
ValeryS
Модератор
6512 / 4978 / 460
Регистрация: 14.02.2011
Сообщений: 16,486
27.11.2013, 17:17     Определить, делится ли это число на 15 #31
Цитата Сообщение от Lynxsmr Посмотреть сообщение
Можно ведь представить его не только в виде массива, но и в виде int.
можно то можно но уж больно хлипенький получится
максимум 10 разрядов (1023)
а вообще пускай это ТС решает или тот кто задал ему эту задачу
Lynxsmr
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 3
27.11.2013, 17:24     Определить, делится ли это число на 15 #32
Да, не обратил внимание
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2013, 17:38     Определить, делится ли это число на 15
Еще ссылки по теме:

Найти ближайшее к данному число, которое делится на 3, но не делится на 2. C++
C++ Найти ближайшее число,которое делится на 3, но не делится на 2
Если a делится на b или b делится на a, то вывести 1, иначе – любое другое число C++
C++ Найти натуральное число M такое, что M делится на N и сумма цифр M делится на N
C++ Если а делится на b или b делится на а, то вывести 1, иначе— любое другое число

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ya_noob
_
201 / 145 / 9
Регистрация: 08.10.2011
Сообщений: 432
27.11.2013, 17:38     Определить, делится ли это число на 15 #33
Цитата Сообщение от ValeryS Посмотреть сообщение
признак деления на 5 это в конце 0 или 5 а признак деления на 3 это сумма всех разрядов делится на 3
это справедливо для 10-чной СС, но не для 2-чной. ТС говорит, что нельзя переводить в другие СС, так что эти признаки не применимы.
Цитата Сообщение от ValeryS Посмотреть сообщение
сколько времени он будет вбивать 100 значное число
пару секунд
Цитата Сообщение от Ildan Посмотреть сообщение
Я уже совсем запутался
признака делимости, что я указал уже достаточно, чтобы понять что делать. перечитайте то сообщение внимательно и скажите наконецтоужвконцетоконцов чему же равно х
Yandex
Объявления
27.11.2013, 17:38     Определить, делится ли это число на 15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru