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

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

Войти
Регистрация
Восстановить пароль
 
 
Абубакр
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 9
#1

Проверка делимости 1,11,111,.,11.1 на их позиции - C++

09.07.2015, 22:17. Просмотров 948. Ответов 30
Метки нет (Все метки)

Дана последовательность из чисел (последовательность из единиц): 1, 11, 111, ..., 11..1. (до N)
Требуется определить делимость числа на его порядковый номер и записать в массив 0 или 1.
Я написал решение, но с проблемами.
Вот мой код:
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
#include <iostream>
#include <string>
#include <stdlib.h>
#include <sstream>
 
using namespace std;
 
template <typename T>
string toStr(T val){
    ostringstream oss;
    oss<< val;
    return oss.str();
}
 
int main()
{
//-----------------ВВОД ВЫВОД ПОСЛЕДОВАТЕЛЬНОСТЕЙ------------------
    int i,j,N;
    cout<<"Vvedite N:";
    cin>>N;
    cout<<endl;
 
    string *a=new string[N];
    int *is_div = new int[N];
 
    a[0]="1";
    for(i=1;i<N;++i)
        for(j=0;j<=i;++j)
            a[i]+='1';
    for(i=0;i<N;++i)
        cout<<a[i]<<endl;
//--------АЛГОРИТМ ДЕЛЕНИЯ--------------------------
    string x;
    int dlina_a,x_ch,ost,result_ost;
 
    for(i=0;i<N;++i){
//N_a - Номер числа, kolpos_N - Кол.-во цифр в числе, dlina_a - длина числа
            int N_a=i+1,N1=N_a,kolpos_N=0,dlina_a=N_a;
 
            while(N1>0){
                N1=N1/10;
                kolpos_N++;
            }
        while(dlina_a>0){
            x=a[i].substr(0,kolpos_N);
                dlina_a-=kolpos_N;
                    a[i]=a[i].erase(0,kolpos_N);
            x_ch = atoi(x.c_str());
            if(x_ch<N_a){
                x+=a[i].substr(0,1);
                a[i]=a[i].erase(0,1);
                dlina_a-=1;
            }
            ost = x_ch%N_a;
            if(ost==0 && dlina_a>0)
                continue;
            else if(ost!=0 && dlina_a>0)
                a[i]=toStr(ost)+a[i];
            else
                result_ost=ost;
        }
        if(result_ost)
            is_div[i]=1;
        else
            is_div[i]=0;
    }
    for(int k=0;k<N;++k)
        cout<<is_div[k]<<"\n";
    return 0;
}
В массив is_div должны сохраняться ответы 0-"нет" или 1-"да".
У меня выводит, что 1%1=0, 11%2=1, 111%3=1 - ошибка. т.е. после первого цикла в is_div сохраняются только единицы. Помогите решить задачу.
Вот что у меня получается:
0
Миниатюры
Проверка делимости 1,11,111,.,11.1 на их позиции  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2015, 22:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка делимости 1,11,111,.,11.1 на их позиции (C++):

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

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

Ввод чисел и проверка их делимости - C++
Программа осуществляет ввод чисел и проверяет их делимость на 2 и 3. Сообщение о том, что введенное число делится на 2 или 3 или...

Однонаправленный список. Операции: удалить элемент из заданной позиции, добавить элемент в заданную позицию,проверка на неравенство - C++
Помогите. Есть одна написанная. Условия: Очередь. Операции: “+” добавить элемент ; “-“ удалить элемент ; bool() проверка «Пуста...

Вычислить сумму ряда с позиции N до позиции M. Функцию вычисления суммы реализовать рекурсивно. - C++
9. Вычислить сумму ряда (-1)в степени 3n/3n! с позиции N до позиции M. Функцию вычисления суммы реализовать рекурсивно. Добавлено...

Проверка мобильного номера на соответствие формату +7(111)111-11-11 - C#
Проверка мобильного номера на соответствие формату +7(111)111-11-11 Как мне избавиться от этого ужаса , не пойму как цикл написать ...

30
Sn1p3rOk
281 / 168 / 66
Регистрация: 19.04.2014
Сообщений: 1,096
Завершенные тесты: 2
09.07.2015, 22:43 #2
Для начала 111 % 3 = 0.
0
Абубакр
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 9
09.07.2015, 22:49  [ТС] #3
НУ и я об этом, у меня выводит 1-цы
0
Sn1p3rOk
281 / 168 / 66
Регистрация: 19.04.2014
Сообщений: 1,096
Завершенные тесты: 2
09.07.2015, 22:55 #4
Поясните мне смысле 26 и 27 строки зачем присваивать значение а[0] = "1" ?
0
Абубакр
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 9
09.07.2015, 23:05  [ТС] #5
Чтобы в цикле конкатенировать 1-цы в массив.
a[0]="1"
a[1]="11"
...
a[N-1]="11..1" (кол-во единиц=N)

Проблема в алгоритме, а не вводе выводе
0
Sn1p3rOk
281 / 168 / 66
Регистрация: 19.04.2014
Сообщений: 1,096
Завершенные тесты: 2
09.07.2015, 23:12 #6
Да ещё 1111%4 = 3. Остаток от деления возвращает 0 или 1 если деление идет на 2. То есть число четное или не четное. Если вы делите на число отличное от двух то остаток от деления будет не только 0 или 1.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
09.07.2015, 23:15 #7
а зачем заморачиватся со строками?
C++
1
2
3
4
5
6
7
unsigned long long a=1;
for(int i=0; i<n;i++)
{
arr[i]=(a%(i+1))==0;
a=a*10+1;
 
}
1
Sn1p3rOk
281 / 168 / 66
Регистрация: 19.04.2014
Сообщений: 1,096
Завершенные тесты: 2
09.07.2015, 23:15 #8
Цитата Сообщение от Абубакр Посмотреть сообщение
Чтобы в цикле конкатенировать 1-цы в массив.
a[0]="1"
C++
1
2
3
4
5
6
7
8
9
10
11
12
// Зачем так ?
a[0]="1";
    for(i=1;i<N;++i)
        for(j=0;j<=i;++j)
            a[i]+='1';
 
// Если правильнее сделать так
for (i = 0; i < N; i ++)
    for (j = 0; j <= i; j ++)
        a[i] += '1';
 
// И не нужно никакое a[0] = "1";
1
Абубакр
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 9
09.07.2015, 23:17  [ТС] #9
is_dev - массив, в котором сохраняются ответы: 0-"число не делится на свой порядковый номер" 1-"делится"
0
Sn1p3rOk
281 / 168 / 66
Регистрация: 19.04.2014
Сообщений: 1,096
Завершенные тесты: 2
09.07.2015, 23:27 #10
Вот держи код.
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
#include <iostream>
#include <sstream>
#include <string>
 
using namespace std;
 
int main()
{
    int N = 5;
    
    int is_dev[N];
    
    string* a = new string[N];
    
    for (int i = 0; i < N; i ++)
    {
        for (int j = 0; j <= i; j ++)
        {
            a[i] += '1';
        }
    }
 
    for (int i = 0; i < N; i ++)
    {
        cout << a[i] << endl;
    }
    
    int some_int;
    
    for (int i = 0; i < N; i ++)
    {
        // Вместо atoi
        istringstream buffer(a[i]);
        buffer >> some_int;
 
        if (some_int % (i + 1) > 0)
        {
            is_dev[i] = 1;
        }
        else
        {
            is_dev[i] = 0;
        }
    }
    
    for (int i = 0; i < N; i ++)
    {
        cout << is_dev[i] << endl;
    }
    
    return 0;
}
Добавлено через 2 минуты
Естественно здесь только та часть кода с которой у тебя проблема. Изменишь под свой код и все будет ок.
1
Абубакр
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 9
09.07.2015, 23:30  [ТС] #11
Цитата Сообщение от ValeryS Посмотреть сообщение
а зачем заморачиватся со строками?
Если длина числа больше чем long long int
0
Sn1p3rOk
281 / 168 / 66
Регистрация: 19.04.2014
Сообщений: 1,096
Завершенные тесты: 2
09.07.2015, 23:31 #12
Работоспособность кода выше можешь проверить по ссылке.
http://ideone.com/fudUK2
0
Абубакр
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 9
09.07.2015, 23:40  [ТС] #13
Например, если вводить N=250, то получится 1111111....111111, т.е. огромное число и это его невозможно одним условием проверить. Надо разбивать и проверять по частям, но у меня не получается.

Добавлено через 3 минуты
Sn1p3rOk, спасибо за исходник. Можешь сделать для чисел, длина которых больше 10 цифр?
0
Shamil1
Модератор
1623 / 1048 / 192
Регистрация: 26.03.2015
Сообщений: 3,890
09.07.2015, 23:41 #14
Цитата Сообщение от Абубакр Посмотреть сообщение
Если длина числа больше чем long long int
Есть специальные библиотеки. Например, gmp.
Или Вы хотите самостоятельно реализовать деление длинных чисел?

Тогда число надо хранить не в массиве строк, а в массиве unsigned long.
Делить столбиком, считая каждый из элементов массива за одну цифру.
1
Sn1p3rOk
281 / 168 / 66
Регистрация: 19.04.2014
Сообщений: 1,096
Завершенные тесты: 2
09.07.2015, 23:48 #15
Цитата Сообщение от Абубакр Посмотреть сообщение
Например, если вводить N=250, то получится 1111111....111111, т.е. огромное число
Это уже бред получится, число из 250 знаков превышает количество частиц во Вселенной (видимой).
Я даже понять не смогу кому будет нужно число большее гугола. Прошу не путать с Google
0
09.07.2015, 23:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2015, 23:48
Привет! Вот еще темы с ответами:

MaskEditExtension. При записи содержимого Textbox в БД, вместо 111-111-111 11 пишется 11111111111 - Visual Basic .NET
Здравствуйте уважаемые форумчане! Написал небольшой проект (сайт), где расположена форма для заполнения и внесения данных в БД. Все...

Проверка делимости на 16 - Assembler
Как сделать программу, которая предоставляет переменной типа byte стоимость 1,если переменная типа word делится на 16 и стоимость 0, если...

Проверка делимости на 11 - Assembler
Доброго времени суток! Помогите, пожалуйста, есть задачка. Нужно определить вероятность деления числа на 11 и вывести на экран &quot;делится&quot;...

Проверка делимости числа на 11 - C (СИ)
Вводится число от 0 до 10^1000 Нужно проверить на делимость на 11


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

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

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