17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
1

Счастливые числа

25.12.2013, 05:01. Показов 5261. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот мой код:
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 <stdio.h>
 
int main()
{
    int T,count,i,s,k,l,r;
 
    s = 0;
    k = 0;
 
    scanf("%d", &T);
 
    for(count = 1;count <= T;count++){
        scanf("%d %d", &l, &r);
 
        for(i = l;i <= r;i++){
            if(i / 4 == 1 || i / 7 == 1)
                s = k + 1;
        }
        printf("%d\n", s);
    }
 
    return 0;
}
В задаче нужно вычислить количество чисел между L и R включительно, которые нацело делятся на 4 или на 7. То есть если даны числа 4 и 7, то должно выдать 2. У меня всегда выводит 1. Даже если я выбираю числа 0 и 0. В чем проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2013, 05:01
Ответы с готовыми решениями:

Счастливые числа
Счастливым будем считать такое число из шести цифр, кортом сумма левых трех цифр равна сумме правых...

Счастливые числа <N
2n-разрядное число считается счастливым, если у него сумма первых n цифр равна сумме вторых n цифр....

Счастливые числа
Счастливым числом называется натуральное число, у которого сумма цифр первой половины равна сумме...

Счастливые числа
Как-то не могу вникнуть в суть кода :( Назовем число счастливым, если сумма цифр на четных...

21
60 / 60 / 19
Регистрация: 11.07.2013
Сообщений: 305
25.12.2013, 05:25 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
int main(){
    setlocale(0,"");
    int i,s,k,l,r;
    s = 0;
    k = 0;
    cin>>l>>r;
        for(i = l;i <= r;i++){
            if(!(i%4))s++;
            if(!(i%7))s++;
        }
    cout<<s;
    system("pause>>void");
}
Может так? Ведь если будет число 28, то s должно 2 раза плюсануть, т.к. оно делится нацело и на 4, и на 7...
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
25.12.2013, 05:46  [ТС] 3
Я понимаю. Но мне же нужно, чтобы количество чисел в цикле вычислялось. Немного изменил код
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
#include <stdio.h>
 
int main()
{
    int T,count,i,s,k,l,r;
 
    s = 0;
    k = 0;
 
    scanf("%d", &T);
 
    for(count = 1;count <= T;count++){
        scanf("%d %d", &l, &r);
 
        for(i = l;i <= r;i++){
            if(i / 4 || i / 7)
                k+=1;
            s = k;  
        }
        printf("%d\n", s);
    }
 
    return 0;
}
Теперь количество вычисляется не для отдельных тестов а все прибавляется и прибавляется, пока программа не завершится. И почему то когда я ввожу числа 4 и 7, то мне выдает 4, то есть и 5/4 и 6/4. А мне нужно суммировать количество тех чисел, которые делятся нацело без остатка на 4 или на 7. Как это сделать?
0
60 / 60 / 19
Регистрация: 11.07.2013
Сообщений: 305
25.12.2013, 06:01 4
Я разве написал не готовый код?
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
И почему то когда я ввожу числа 4 и 7, то мне выдает 4, то есть и 5/4 и 6/4. А мне нужно суммировать количество тех чисел, которые делятся нацело без остатка на 4 или на 7. Как это сделать?


Добавлено через 2 минуты
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Я понимаю. Но мне же нужно, чтобы количество чисел в цикле вычислялось.
Цитата Сообщение от uhx Посмотреть сообщение
if(!(i%4))s++;
if(!(i%7))s++;
Я тебя что-то не понимаю. Ты мой код то компилил?
1
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
25.12.2013, 06:13  [ТС] 5
Да, теперь количество вычисляется. Но мне нужно чтоб количество вычислялось для каждого теста отдельно. То есть, если первый раз я введу 4 7 - покажет 2, а второй раз я введу 3 4 и должно показать 1. А сейчас программа к 2-ум прибавляет 1.
0
60 / 60 / 19
Регистрация: 11.07.2013
Сообщений: 305
25.12.2013, 06:32 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int main(){
    setlocale(0,"");
    int i,s,k,l,r;
    cout<<"Кол-во тестов: ";
    cin>>k;
    while(k--){
        s=0;
        system("cls");
        cin>>l>>r;
        for(i = l;i <= r;i++){
            if(!(i%4))s++;
            if(!(i%7))s++;
        }
    cout<<s;
    system("pause>>void");
    }
}
Добавлено через 1 минуту
Теперь вроде все) Удачи.
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
25.12.2013, 06:33  [ТС] 7
Так как сделать вычисление количества чисел отдельно для каждого теста, чтоб оно не суммировалось? Помогите.
0
60 / 60 / 19
Регистрация: 11.07.2013
Сообщений: 305
25.12.2013, 06:36 8
Sh@dow777, обновить тему и скопировать мой код Могу комменты написать, если чего не понятно.
1
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
25.12.2013, 07:03  [ТС] 9
Спасибо огромное! Как я не догадался s = 0 в цикл вставить.

Добавлено через 3 минуты
Я просто только начал изучать программирование. Надо зачет сдать. На каникулах буду сидеть сам пытаться задачи решать.

Добавлено через 19 минут
Я проверил ответ на сайте с задачами и система проверки не приняла задачу. Я посмотрел, как там показано, как должно быть. Я ввел числа 3 33 и мне выдало 12, а показано, что должно быть 11. Ввел 1234 4321 - мне выдало 1213, а должно выдать 1103. Я ничего не понимаю, что они хотят.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.12.2013, 07:21 10
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Я ничего не понимаю, что они хотят.
они хотят, чтобы числа кратные 4 и 7 одновременно, считались за одно число (а данный код считает их за два).
Вот так сделайте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int main(){
    setlocale(0,"");
    int i,s,k,l,r;
    cout<<"Кол-во тестов: ";
    cin>>k;
    while(k--){
        s=0;
        system("cls");
        cin>>l>>r;
        for(i = l;i <= r;i++){
            if(!(i%4))s++;else
            if(!(i%7))s++;
        }
    cout<<s;
    system("pause>>void");
    }
}
1
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
25.12.2013, 07:31  [ТС] 11
Спасибо. Теперь все правильно. А не могли бы вы мне обьяснить зачем нужны восклицательные знаки перед (i % 4) и перед (i % 7)?

Добавлено через 4 минуты
Извините, но система снова выдала неправильный ответ. Пишет превышено максимальное время работы на тесте 1.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.12.2013, 08:13 12
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Извините, но система снова выдала неправильный ответ. Пишет превышено максимальное время работы на тесте 1.
Вам программу писали для работы в ручном режиме. Т.е. выдает соббщение, что введите количество тестов, потом считает, выдает результат на экран, потом ждет пока не введете что-нибудь (поэтому и превышено максимальное время). Для тестирующей системы нужно так писать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int main(){
    setlocale(0,"");
    int i,s,k,l,r;
    cout<<"Кол-во тестов: ";
    cin>>k;
    while(k--){
        s=0;
        system("cls");
        cin>>l>>r;
        for(i = l;i <= r;i++){
            if(!(i%4))s++;else
            if(!(i%7))s++;
        }
    cout<<s;
    system("pause>>void");
    }
}
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
А не могли бы вы мне обьяснить зачем нужны восклицательные знаки перед (i % 4) и перед (i % 7)?
если число делится на 4, то i%4 будет равно 0. Применяя ! к нулю, получаем 1.
Т.е. выражение !(i%4) будет равно 1, когда число i делится на 4 без остатка. Когда число i не делится на 4 без остатка, то выражение !(i%4) будет равно 0.
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
25.12.2013, 08:23  [ТС] 13
Вот я переделал, как вы сказали(только на C)
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
#include <stdio.h>
 
int main()
{
    long T,count,i,s,k,l,r;
 
 
    scanf("%ld", &T);
 
    for(count = 1;count <= T;count++){
        scanf("%ld %ld", &l, &r);
 
        s = 0;
 
        for(i = l;i <= r;i++){
            if(!(i % 4))
                s++;
            else if(!(i % 7))
                s++;
        }
 
        printf("%ld\n", s);
    }
 
    return 0;
}
И все равно выдает ошибку.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.12.2013, 08:28 14
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
И все равно выдает ошибку.
полный текст задания напишите здесь.
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
25.12.2013, 08:32  [ТС] 15
Вася называет число счастливым, если оно нацело делится на 4 или на 7. Ваша задача состоит в том, чтобы посчитать количество счастливых чисел между числами L и R включительно.
Input

Первая строка содержит одно число N (1 <= N <= 5000) (количество тестовых случаев). Следующие N строк содержат по 2 числа L и R (1 <= L <= R <= 1,000,000,000) разделенных пробелом.
Output

Для каждого тестового случая в отдельной строке выведите количество счастливых чисел между L и R включительно.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.12.2013, 08:36 16
Ссылку на сайт с задачей можете дать?
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
25.12.2013, 08:49  [ТС] 17
Это сайт университетский. Поэтому вам нужно будет регистрироваться.

Добавлено через 3 минуты
http://ejudge.crimea.edu/cgi-b... ocale_id=1
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.12.2013, 08:50 18
Хорошо, тогда такие вопросы:
1. Какую ошибку выдает тестирующая система на последний код?
2. Нет ли там в разделе "помощь" или "новичкам" фразы о том что данные нужно считывать из файла и результат записывать в файл?
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
25.12.2013, 08:56  [ТС] 19
1) превышено максимальное время работы на тесте 1.
2) раздела помощь нет.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.12.2013, 09:20 20
превышение времени было еще из-за таких ограничений:
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Первая строка содержит одно число N (1 <= N <= 5000) (количество тестовых случаев). Следующие N строк содержат по 2 числа L и R (1 <= L <= R <= 1,000,000,000) разделенных пробелом.
в худшем случае время работы было бы: 1000000000*5000, естественно за 1 сек не получилось бы сдать. Пробуйте такой вариант (у меня он прошел):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main()
{
    long T,count,i,s,k,l,r;
    
    scanf("%ld", &T);
 
    for(count = 1;count <= T;count++){
        scanf("%ld %ld", &l, &r);
 
        s = (r/4+r/7-r/28)-((l-1)/4+(l-1)/7-(l-1)/28);
 
        printf("%ld\n", s);
    }
 
    return 0;
}
2
25.12.2013, 09:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2013, 09:20
Помогаю со студенческими работами здесь

6-значные счастливые числа
Здравствуйте, прошу помощи! Тема: Функции. Получить все 6-значные счастливые числа, т.е....

Найти все шестизначные счастливые числа (исправить код)
Задание: Найти все шестизначные счастливые числа. Счастливое число - это число, у которого сумма...

Счастливые билеты
Знаю, что вопрос довольно распространенный и решений можно найти много, но у меня ограниченное...

Счастливые билетики
Знаю что задача довольна распространена, но решения для моего случая не нашел. Необходимо найти...


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

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

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