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

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

Восстановить пароль Регистрация
 
Anonimus1234
0 / 0 / 0
Регистрация: 29.08.2008
Сообщений: 10
09.12.2010, 21:45     Интервалы. Где дыра в алгоритме ? #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++ Ошибка в алгоритме
Интервалы C++
функции. (ошибка в алгоритме) C++
Ошибка в алгоритме слияние массивов C++
Ошибка в алгоритме сортировки C++
Ошибка в алгоритме со строками C++
Ошибка компиляции в Алгоритме Брезенхэма C++
Биты и байты в алгоритме Хаффмана C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
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     Интервалы. Где дыра в алгоритме ?
Ответ Создать тему
Опции темы

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