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

Счастливые числа - C++

Восстановить пароль Регистрация
 
 
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
25.12.2013, 05:01     Счастливые числа #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
#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. В чем проблема?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
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...
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
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. Как это сделать?
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
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++;
Я тебя что-то не понимаю. Ты мой код то компилил?
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
25.12.2013, 06:13  [ТС]     Счастливые числа #5
Да, теперь количество вычисляется. Но мне нужно чтоб количество вычислялось для каждого теста отдельно. То есть, если первый раз я введу 4 7 - покажет 2, а второй раз я введу 3 4 и должно показать 1. А сейчас программа к 2-ум прибавляет 1.
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
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 минуту
Теперь вроде все) Удачи.
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
25.12.2013, 06:33  [ТС]     Счастливые числа #7
Так как сделать вычисление количества чисел отдельно для каждого теста, чтоб оно не суммировалось? Помогите.
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
25.12.2013, 06:36     Счастливые числа #8
Sh@dow777, обновить тему и скопировать мой код Могу комменты написать, если чего не понятно.
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
25.12.2013, 07:03  [ТС]     Счастливые числа #9
Спасибо огромное! Как я не догадался s = 0 в цикл вставить.

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

Добавлено через 19 минут
Я проверил ответ на сайте с задачами и система проверки не приняла задачу. Я посмотрел, как там показано, как должно быть. Я ввел числа 3 33 и мне выдало 12, а показано, что должно быть 11. Ввел 1234 4321 - мне выдало 1213, а должно выдать 1103. Я ничего не понимаю, что они хотят.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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");
    }
}
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
25.12.2013, 07:31  [ТС]     Счастливые числа #11
Спасибо. Теперь все правильно. А не могли бы вы мне обьяснить зачем нужны восклицательные знаки перед (i % 4) и перед (i % 7)?

Добавлено через 4 минуты
Извините, но система снова выдала неправильный ответ. Пишет превышено максимальное время работы на тесте 1.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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.
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
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;
}
И все равно выдает ошибку.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2013, 08:28     Счастливые числа #14
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
И все равно выдает ошибку.
полный текст задания напишите здесь.
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
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 включительно.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2013, 08:36     Счастливые числа #16
Ссылку на сайт с задачей можете дать?
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
25.12.2013, 08:49  [ТС]     Счастливые числа #17
Это сайт университетский. Поэтому вам нужно будет регистрироваться.

Добавлено через 3 минуты
http://ejudge.crimea.edu/cgi-bin/new...39&locale_id=1
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2013, 08:50     Счастливые числа #18
Хорошо, тогда такие вопросы:
1. Какую ошибку выдает тестирующая система на последний код?
2. Нет ли там в разделе "помощь" или "новичкам" фразы о том что данные нужно считывать из файла и результат записывать в файл?
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
25.12.2013, 08:56  [ТС]     Счастливые числа #19
1) превышено максимальное время работы на тесте 1.
2) раздела помощь нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2013, 09:20     Счастливые числа
Еще ссылки по теме:

C++ Счастливые билеты
C++ Счастливые билеты
C++ Счастливые билетики

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

Или воспользуйтесь поиском по форуму:
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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;
}
Yandex
Объявления
25.12.2013, 09:20     Счастливые числа
Ответ Создать тему
Опции темы

Текущее время: 16:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru