Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 21:37   #1
Russell32
Новичок
Джуниор
 
Регистрация: 09.12.2010
Сообщений: 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.
Но при сдачи этой проги, пишется что решение не полное. Те тесты которые в условии у меня проходят верно, у комиссии некоторые из них не проходят. В чем у меня проблема, в чем я не прав ?
Вот листинг :

Код:
#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;
}

Последний раз редактировалось ACE Valery; 09.12.2010 в 23:59.
Russell32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача "Бусы". Пятая международная олимпиада по информатике, г. Мендоса, Аргентина, 16-25 октября 1993 г. final_sleep Помощь студентам 1 05.12.2010 21:42
Задача по информатике serega77 Помощь студентам 1 02.12.2010 21:30
Пожалуйста, подскажите в чем у меня ошибка? wepoTWR Помощь студентам 8 09.12.2009 22:34
Решение, подготовка к олимпиадам по информатике . Задача парехмахер. LuMax Помощь студентам 6 02.12.2009 17:22
У меня проблема Pusher HTML и CSS 3 03.05.2008 02:12