Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
1

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

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

Author24 — интернет-сервис помощи студентам
"Пользователь вводит двоичное число. Нужно определить делится ли это число на 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)
Есть ли в С++ возможность, работать с двоичными числами или все намного сложнее. Помогите с этим вопросом, пожалуйста! В С++ я новичок и сам не смог разобраться=(
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2013, 15:15
Ответы с готовыми решениями:

Делится ли заданное четырехзначное число нацело на произведение цифр, составляющих это число
3.1 Проверить, делится ли заданное четырехзначное число нацело на произведение цифр, составляющих...

Проверить, делится ли введенное трехзначное число нацело на сумму цифр, составляющих это число
1. Проверить, делится ли введенное трехзначное число нацело на сумму цифр, составляю-щих это...

Определить, делится ли число нацело на 7 и делится ли на 3
помогите решить ребят((((я так устала(( 1.Задано четырехзначное целое число. Делится ли оно...

Разработать программу, проверяющую, делится ли целое четырехзначное число N нацело на сумму цифр, составляющих это число
Очень нужна помощь,если кому не лень уделить пару минут на решение,огромная благодарность! ...

32
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
27.11.2013, 15:34  [ТС] 21
Author24 — интернет-сервис помощи студентам
ya_noob,
Цитата Сообщение от ya_noob Посмотреть сообщение
так чему равно x ?
Я уже совсем запутался, объясните, пожалуйста, все по порядку, что я должен делать, если вас это не затруднит. Я в тупике(
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
27.11.2013, 15:38 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");
}
1
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
27.11.2013, 15:48  [ТС] 23
ValeryS, Спасибо Вам огромное!!все работает правильно. только в ответе выдает очень длинное число типа "0000000000000001111" но это не важно)Вы спасли меня от мучений сессии)
0
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 11
27.11.2013, 15:52 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)
лучше через рекурсию писать
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
27.11.2013, 16:00 25
zzzvolk,
проблема то не в том что бы проверить можно разделить или нельзя
а в том что С не поддерживает двоичных значений
следовательно число должно быть или в массиве или в строке
и для этого представления надо создать арифметику
Цитата Сообщение от Ildan Посмотреть сообщение
только в ответе выдает очень длинное число типа "0000000000000001111" но это не важно)
это проверка числа, что правильно ввел, можешь выбросить, показывает все разряды
если бы ты ввел как хотел 10000 разрядов вообще бы одни 0 увидел
там еще бесконечный цикл чтобы можно было не одно число проверить а несколько
тоже не есть гут
1
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
27.11.2013, 16:08  [ТС] 26
ValeryS, да ладно, оставлю. все равно проверяют только с бумаги(на компе его проверять не будут). осталось только понять по пунктам, что делает программа. Еще раз большое спасибо!
0
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
27.11.2013, 16:30 27
ValeryS, назовите максимальное число, которое ваша программа может проверить за разумное время (хотя бы примерно).
0
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 3
27.11.2013, 16:54 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;
}
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
27.11.2013, 17:05 29
Цитата Сообщение от ya_noob Посмотреть сообщение
ValeryS, назовите максимальное число, которое ваша программа может проверить за разумное время (хотя бы примерно).
а я что утверждал что это самая быстрая программа?
нет конечно это самое тупое решение
но и самое очевидное
конечно здесь нужна теория
самое первое что приходит в голову это то что 15=5*3
признак деления на 5 это в конце 0 или 5
а признак деления на 3 это сумма всех разрядов делится на 3
значит признак делимости на 15 это сумма должна делится на 3 и оканчиваться на 5 или 0
в качестве оправдания могу сказать что второе слабое место здесь человек, сколько времени он будет вбивать
100 значное число

Добавлено через 5 минут
Lynxsmr,
а где у тебя двоичное число???
только не надо говорить что все числа в компе двоичные, это я и так знаю
У ТС другая проблема
Цитата Сообщение от Ildan Посмотреть сообщение
Но загвоздка заключается в том, что мне после проверки выполненной работы, поставили условие: что введенное двоичное число не должно переводится в десятичную СС,
следовательно нужно сначала придумать представление числа
а потом уже к нему пришпандоривать арифметику
я вот предложил массив, согласен не самый лучший способ, но просто лежит на поверхности
0
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 3
27.11.2013, 17:14 30
Цитата Сообщение от ValeryS Посмотреть сообщение
Lynxsmr,
а где у тебя двоичное число???
Цитата Сообщение от ValeryS Посмотреть сообщение
следовательно нужно сначала придумать представление числа
Можно ведь представить его не только в виде массива, но и в виде int с 0 и 1.
В идеале, правда, нужно сделать проверку при вводе, но вряд ли это существенно.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
27.11.2013, 17:17 31
Цитата Сообщение от Lynxsmr Посмотреть сообщение
Можно ведь представить его не только в виде массива, но и в виде int.
можно то можно но уж больно хлипенький получится
максимум 10 разрядов (1023)
а вообще пускай это ТС решает или тот кто задал ему эту задачу
0
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 3
27.11.2013, 17:24 32
Да, не обратил внимание
0
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
27.11.2013, 17:38 33
Цитата Сообщение от ValeryS Посмотреть сообщение
признак деления на 5 это в конце 0 или 5 а признак деления на 3 это сумма всех разрядов делится на 3
это справедливо для 10-чной СС, но не для 2-чной. ТС говорит, что нельзя переводить в другие СС, так что эти признаки не применимы.
Цитата Сообщение от ValeryS Посмотреть сообщение
сколько времени он будет вбивать 100 значное число
пару секунд
Цитата Сообщение от Ildan Посмотреть сообщение
Я уже совсем запутался
признака делимости, что я указал уже достаточно, чтобы понять что делать. перечитайте то сообщение внимательно и скажите наконецтоужвконцетоконцов чему же равно х
0
27.11.2013, 17:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2013, 17:38
Помогаю со студенческими работами здесь

Число вводится своим двоичным представлением. Определить, делится ли число на 15
4)Число вводится своим двоичным представлением(длина числа не привышает 10000 двоичных...

Определить, является ли целое число N четным двузначным числом, и делится ли оно на число K
Определить, является ли целое число N четным двузначным числом, и делится ли оно на число K (...

Определить, делится ли число на 15
Число вводится своим двоичным представлением (длина числа не превышает 1000 двоичных разрядов)....

Определить, делится ли число на 5
Пользователь вводит с клавиатуры число, программа должна определить делиться ли это число на 5,...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru