С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

26.11.2013, 15:15. Просмотров 1764. Ответов 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)
Есть ли в С++ возможность, работать с двоичными числами или все намного сложнее. Помогите с этим вопросом, пожалуйста! В С++ я новичок и сам не смог разобраться=(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2013, 15:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить, делится ли это число на 15 (C++):

Определить, делится ли число на 4 без остатка - C++
Дано натуральное число N. Если оно делится на 4, вывести на экран ответ N=4k (где k — соответствующее частное); если остаток от деления...

перевод строки в число, определить делится ли оно на 4 - C++
пожалуйста помогите! нужно определить делится ли строка на 4. я так понял что функция atoi не подходит, как еще это можно сделать?

Определить, делится ли на три введенное с клавиатуры целое число - C++
1.написать программу, которая проверяет, является ли введенное пользователем целое число четных. 2. написать программу, которая...

Если а делится на b или b делится на а, то вывести 1, иначе— любое другое число - C++
Даны два целых числа а и b. Если а делится на b или b делится на а, то вывести 1, иначе— любое другое число. Условные операторы и...

Если a делится на b или b делится на a, то вывести 1, иначе – любое другое число - C++
Доброго времени суток! В С++ недавно, но в универе уже задали такие задачи: 4)Даны два целых числа a и b. Если a делится на b или b...

Найти натуральное число M такое, что M делится на N и сумма цифр M делится на N - C++
256 мегабайт, 2 секунды Задано натуральное число N (1 ≤ N ≤ 100 000). Найдите натуральное число M такое, что M делится на N и сумма...

32
Ildan
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 10
27.11.2013, 11:54  [ТС] #16
ya_noob,можно по-подробнее, я толком не понял ваши мысли
Цитата Сообщение от ya_noob Посмотреть сообщение
переведенного в систему счисления по основанию x
но по условию задачи, введенное двоичное число нельзя переводить в другие СС((
0
ya_noob
_
203 / 147 / 9
Регистрация: 08.10.2011
Сообщений: 432
27.11.2013, 12:48 #17
Цитата Сообщение от Ildan Посмотреть сообщение
введенное двоичное число не должно переводится в десятичную СС
Цитата Сообщение от Ildan Посмотреть сообщение
введенное двоичное число нельзя переводить в другие СС((
определитесь!

а вообще число полностью не нужно переводить в другую СС, только его цифры.

насчет х: это задача из теории чисел: число в СС по основанию k делится на k - 1 если сумма его цифр делится на k - 1. если хотите, то можете попробовать доказать. идея такая: разложите число в многочлен по степеням k, поделите на k - 1 и рассмотрите остаток от деления.
0
Ildan
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 10
27.11.2013, 14:05  [ТС] #18
ya_noob,
Цитата Сообщение от ya_noob Посмотреть сообщение
определитесь!
задание такое, что программа должна работать только в двоичной СС. используя признаки деления на 15. т.к. признак деления на 15 нет, то возможно нужно работать с признаками деления на 3 и 5 (3*5=15). Но дело в том, что я не знаю как это реализовать в программе((
0
ya_noob
_
203 / 147 / 9
Регистрация: 08.10.2011
Сообщений: 432
27.11.2013, 14:40 #19
так чему равно x ?
0
salam
171 / 152 / 16
Регистрация: 10.07.2012
Сообщений: 751
27.11.2013, 15:15 #20
не совсем понятно...
http://basicschool.ru/index.php?page...www.google.ru/
0
Ildan
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 10
27.11.2013, 15:34  [ТС] #21
ya_noob,
Цитата Сообщение от ya_noob Посмотреть сообщение
так чему равно x ?
Я уже совсем запутался, объясните, пожалуйста, все по порядку, что я должен делать, если вас это не затруднит. Я в тупике(
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,254
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
Ildan
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 10
27.11.2013, 15:48  [ТС] #23
ValeryS, Спасибо Вам огромное!!все работает правильно. только в ответе выдает очень длинное число типа "0000000000000001111" но это не важно)Вы спасли меня от мучений сессии)
0
zzzvolk
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
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,254
27.11.2013, 16:00 #25
zzzvolk,
проблема то не в том что бы проверить можно разделить или нельзя
а в том что С не поддерживает двоичных значений
следовательно число должно быть или в массиве или в строке
и для этого представления надо создать арифметику
Цитата Сообщение от Ildan Посмотреть сообщение
только в ответе выдает очень длинное число типа "0000000000000001111" но это не важно)
это проверка числа, что правильно ввел, можешь выбросить, показывает все разряды
если бы ты ввел как хотел 10000 разрядов вообще бы одни 0 увидел
там еще бесконечный цикл чтобы можно было не одно число проверить а несколько
тоже не есть гут
1
Ildan
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 10
27.11.2013, 16:08  [ТС] #26
ValeryS, да ладно, оставлю. все равно проверяют только с бумаги(на компе его проверять не будут). осталось только понять по пунктам, что делает программа. Еще раз большое спасибо!
0
ya_noob
_
203 / 147 / 9
Регистрация: 08.10.2011
Сообщений: 432
27.11.2013, 16:30 #27
ValeryS, назовите максимальное число, которое ваша программа может проверить за разумное время (хотя бы примерно).
0
Lynxsmr
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
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,254
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
Lynxsmr
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 3
27.11.2013, 17:14 #30
Цитата Сообщение от ValeryS Посмотреть сообщение
Lynxsmr,
а где у тебя двоичное число???
Цитата Сообщение от ValeryS Посмотреть сообщение
следовательно нужно сначала придумать представление числа
Можно ведь представить его не только в виде массива, но и в виде int с 0 и 1.
В идеале, правда, нужно сделать проверку при вводе, но вряд ли это существенно.
0
27.11.2013, 17:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2013, 17:14
Привет! Вот еще темы с ответами:

Проверить гипотезу: если сумма цифр числа делится на 3, то и само число делится на 3 - C++
Проверить гипотезу: если сумма цифр числа делится на 3, то и само число делится на 3.

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

Дано целое число N. Найдите все такие целые числа d, что N делится на d2 и не делится на d3. - C++
Вроде все норм работает, по крайней мере числа находит, но почему-то если ввожу большие числа, моя винда пишет сообщение о ошибке. Надеюсь...

Найти ближайшее к данному число, которое делится на 3, но не делится на 2. - C++
Нужно решить задания(Как можно проще...простые коды..(for,while,if,scanf,printf...)) 2)Дано натуральное число. Найти ближайшее к нему...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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