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

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

Войти
Регистрация
Восстановить пароль
 
Anonimus1234
0 / 0 / 0
Регистрация: 29.08.2008
Сообщений: 10
#1

Интервалы. Где дыра в алгоритме ? - C++

09.12.2010, 21:45. Просмотров 401. Ответов 1
Метки нет (Все метки)

Мне надо было написать программу которая по заданным числам a,b,c,d считала количество целых чисел на промежутке (a/b , c/d);
Мой алгоритм : я поместил a/b и c/d в переменные с плавающей запятой.И начал прибавлять к одной переменной 1, пока она меньше или равна другой переменной(количество целых чисел = количеству прибавленных единиц) .С целыми (a/b) и (c/d) работает безотказно. Но с дробными, порой возникают ошибки. Я посмотрел и понял : Если у дробей (a/b) и (c/d) одинаковые хвосты, то результат получается на единицу больше. Я округлил
(c/d) и начал считать до него, но если (a/b) и (c/d) < 0 и (c/d) не целое, то результат на единицу больше,тогда,соответственно интервал -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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdio.h>
#include <math.h>
 
int main(){
freopen("numeric.in","r",stdin);
freopen("numeric.out","w",stdout);
int array[6];
char sign[5];
int number[5];
for(int j = 0;j < 6;j++){
if(j >= 5){array[j] = 0;continue;}
array[j] = 0;
sign[j] = ' ';
number[j] = -100000001;
}
bool flag[4];
flag[0] = true;
flag[2] = true;
scanf("%c%d%c%d%c",&sign[0],&number[0],&sign[1],&number[1],&sign[2]);
switch(sign[2]){
case '/': {
scanf("%d%c",&number[2],&sign[3]);
flag[3] = true;
break;
}
case ',':{
scanf("%d%c",&number[2],&sign[3]);
if(sign[3] == '/'){scanf("%d%c",&number[3],&sign[4]); flag[1] = true; flag[3] = true;}
else{flag[1] = true;} 
break; 
}
default :{break;}
}
int countSign = 0,countNums = 0;
for(int j = 0;j < 5;j++)
{
if(number[j] != -100000001){countNums++;}
if(sign[j] != ' '){countSign++;}
}
 
int trueNums[countNums+1];
for(int j = 0,t = 0;t < countNums;j++)
{
if(number[j] != -100000001){trueNums[t] = number[j];t++;}
 
 
} 
 
 
int k = 0,l = 0;
while(l < 4){
if(flag[l] == true){array[l] = trueNums[k];k++;l++;}
else{array[l] = 1;l++;}
} 
//printf(" a1 %d a2 %d a3 %d a4 %d\n",array[0],array[1],array[2],array[3]);
double a = (double)array[0]/(double)array[1];
double b = (double)array[2]/(double)array[3];
//printf("a %f, b %f\n",a,b);
//-------------------------------------------------------------------------
 
bool first,second;
if(sign[countSign-1] == ')'){second = false;}
else(second = true);
if(sign[0] == '('){first = false;}
else{first = true;}
 
bool eZ1,eZ2;
if((array[0]%array[1] == 0)){eZ1 = true;}
else{eZ1 = false;}
if((array[2]%array[3] == 0)){eZ2 = true;}
else{eZ2 = false;}
int interval = 0;
for(double j = a;j <= (int)b;j += 1) 
{
//printf("a %f, b %f\n",j,b); 
interval++; 
} 
 
 
if(a < 0 && b < 0 && !eZ2){interval--;}
if(eZ1 && !first){ interval--; }
if(eZ2 && !second){ interval--;} 
if(interval < 0){interval = 0;}
printf("%d",interval);
//-------------------------------------------------------------------------
 
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2010, 21:45     Интервалы. Где дыра в алгоритме ?
Посмотрите здесь:

Интервалы - C++
Подпрограммы. Для заданных А и В (A&lt;B) и последовательности целых чисел определите количество чисел, которые принадлежат интервалам ,...

Ошибка в алгоритме - C++
Неправильно работает программа есть сетка (координаты x - в векторе A y - в векторе B) надо из известных точек проложить кратчайший...

Ошибка в алгоритме - C++
Помогите найти ошибку в алгоритме. Алгоритм должен сортировать строки. void SortArrayString(string *&amp;arr, int n, char arr2) /* arr...

Ошибка в алгоритме со строками - C++
По условию задачи, вводится строка со словами, необходимо вывести на экран слово, в котором наименьшее число повторяющихся букв. Т.е....

Утечка памяти в алгоритме - C++
Где ошибка в этом алгоритме? как вывести произведение for (int i = 999; i &gt; 99; --i) { for (int j = 999; j &gt; 99; --j) { ...

Ошибка в алгоритме Хаффмана. С++ - C++
Проблемы с реализацией алгоритма Хаффмана. Код по идее должен быть рабочим, но выскакивает такое окно. Не знаю как исправить. Помогите,...

Ошибка в алгоритме Дейкстры - C++
Помогите, пожалуйста исправить ошибки в коде! Не объявлены идентификаторы &quot;all&quot; &quot;information&quot; &quot;output&quot;, в некоторых местах отсутствуют &quot;;&quot;....

функции. (ошибка в алгоритме) - C++
задание было написать программу для вычисления с заданной точностью. так вот с функцией оно не работает, т.е. результат sum и результат...

Ошибка в алгоритме сортировки - C++
Пожалуйста укажите мне ошибку в реализуемом мною алгоритме сортировки #include &lt;iostream&gt; using namespace std; int main() ...

запутался в алгоритме создания массива - C++
Код. Программа должна нарисовать точки, так как описано в массиве, проблема в том что, она рисует точки только использует еще точку 450,...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
10.12.2010, 02:19     Интервалы. Где дыра в алгоритме ? #2
Не знаю что вы имели в виду под "промежутком", но, так как скобки круглые, я сделал для интервала:
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
//////////////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <limits>
//////////////////////////////////////////////////////////////////////////////////////
template<class T>
bool  equal_to_for_real(T a, T b) 
{
    const T  coef = 10;
    return abs(a - b) < std::numeric_limits<T>::epsilon() * coef;
}
/////////////////////////////////////////////////////////////////////////////////////
template<class T>
bool  greater_for_real(T a, T b) 
{
    return a > b
           && !equal_to_for_real(a, b);
}
/////////////////////////////////////////////////////////////////////////////////////
template<class T>
bool  less_for_real(T a, T b) 
{
    return a < b
           && !equal_to_for_real(a, b);
}
/////////////////////////////////////////////////////////////////////////////////////
template<class T>
bool  greater_equal_for_real(T a, T b) 
{
    return !less_for_real(a, b);
}
/////////////////////////////////////////////////////////////////////////////////////
template<class T>
bool  less_equal_for_real(T a, T b) 
{
    return !greater_for_real(a, b);
}
/////////////////////////////////////////////////////////////////////////////////////
 
int main()
{
    std::locale::global(std::locale(""));
    srand(static_cast<unsigned>(time(0)));
    double  left_real   = 0;
    double  right_real  = 0;
    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;
 
    do
    {
        a = rand() % 10;
        b = rand() % 9 + 1;
        c = rand() % 10;
        d = rand() % 9 + 1;
        left_real   = static_cast<double>(a) / b;
        right_real  = static_cast<double>(c) / d;
    }while(greater_for_real(left_real, right_real));
 
    int  left_int   = (a % b == 0) ? (a / b + 1) : static_cast<int>(ceil   (left_real   ));
    int  right_int  = (c % d == 0) ? (c / d - 1) : static_cast<int>(floor  (right_real  ));
 
    int  int_nums_count = (left_int <= right_int) ? right_int - left_int + 1 : 0;
 
    std::cout << "Количество целых чисел в интервале ("
              << a
              << "/"
              << b
              << ", "
              << c
              << "/"
              << d
              << "), "
              << std::endl 
              << "т.е. ("
              << left_real
              << ", "
              << right_real
              << ") равно: "
              << int_nums_count
              << std::endl;
}
Yandex
Объявления
10.12.2010, 02:19     Интервалы. Где дыра в алгоритме ?
Ответ Создать тему
Опции темы

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