56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
1

Деление на 0

01.03.2010, 19:04. Показов 2052. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
задача:
Условие

Имеется N человек и матрица А размера N´N. Элемент A[i,j] матрицы равен 1, если человек i знаком с человеком j (если i-ый человек знает j-ого, то считаем, что и j-ый человек знает i-ого) и элемент A[i,j] матрицы равен 0, если i-ый человек не знаком с человеком j. Можно ли разбить людей на 2 группы, чтобы в каждой группе были только незнакомые люди.


Входные данные

Входные данные находятся в файле input.in.
· Первая срока содержит количество людей N.
· Затем идут N строк файла, которые задают матрицу знакомств A (каждой строке матрицы соответствует отдельная строка входного файла, числа в строках разделены пробелами).


Выходные данные

Выходные данные находятся в файле output.out.
Если можно разбить людей на две группы, чтобы в каждой группе были только незнакомые люди, то первая строка файла содержит сообщение “YES”, а вторая строка содержит номера людей, которые попали в одну из групп. Числа в строке разделяются одним пробелом и упорядочены по возрастанию.
Если нет, то единственная строка файла содержит сообщение “NO”.

Пример входных данных

4
0 1 0 1
1 0 1 1
0 1 0 1
1 1 1 0

Пример выходных данных

“NO”

результат теста : Ошибка Времени Выполнения(Деление на 0.)

я в упор не вижу в своем коде деление на 0;

подскажите где может быть такая засада

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
#include <stdio.h>
#include <stdlib.h>
 
int compare(const void *a,const void *b)
{
return (*(_int16 *)a)-(*(_int16*)b);
}
 
 
int main()
{
FILE* fin,*fout;
fin=fopen("input.in", "r" );
fout=fopen("output.out", "w");
int n;
fscanf(fin,"%d",&n);
 
int dn=n+n+2;
fgetc(fin);
 
if(n==1){fputs("\"NO\"",fout); return 1;}
if(n==0){fputs("\"NO\"",fout); return 1;}
 
char **a=new char* [n];
 
for (int i=0;i<n;++i){
    a[i]=new char[dn+1];
    fgets(a[i],dn-1,fin);
    
    a[i][dn]=i+48;// or 49;
}
 
    int j=1;
    int delta=0,epsilon=n;
    for(int i=0;i<epsilon;++i)
    {
        int di=i+i;
 
        while(j<epsilon)
        {
                if(a[j][di]<a[j-1][di])
                    {
                        char *temp=a[j-1];
                        a[j-1]=a[j];
                        a[j]=temp;
                        if(j>1)
                        j-=2;
                                            }
                j++;
        }
 
 
        for (int ept=0;ept<epsilon;ept++)
        {if(a[ept][di]=='0')++delta;}
        epsilon=delta;
        delta=0;
        j=1;
    }
 
bool group=true;
 
for(int j=epsilon+epsilon;j<dn-2;j+=2)
    for(int i=epsilon;i<n;i++)
        if(a[i][j]!='0')group=false;
 
if(!group){fputs("\"NO\"\n",fout); return 0;}
 
 
char *c=new char[epsilon+epsilon+1];
for(int i=0;i<epsilon;i++)
{c[i+i]=a[i][dn];
c[i+i+1]=' ';
}
c[epsilon+epsilon]=0;
qsort(c,epsilon,2,compare);
fputs("\"YES\"\n",fout);
fputs(c,fout);
return 2;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2010, 19:04
Ответы с готовыми решениями:

Задача про деление яблок (целочисленное деление)
Ребят,помогите с задачкой,как написать input.txt и output.txt? Помогите решить задачу. C++....

Умножение, деление и деление с остатком
Рассмотрим эти операции на примере. static void Main() { int i = 100, j = 15; double a =...

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

Деление
Деление знаковых чисел, в результате почему-то 0 выскакивает( не могли бы вы найти ошибку? ...

8
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
01.03.2010, 20:04 2
Забавно, а у меня код отработал правильно (под этим я понимаю что нету ошибок и Пример входных данных дает Пример выходных данных). VS 2008
0
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
01.03.2010, 20:23  [ТС] 3
да у меня тоже код работает правильно, и я не могу найти такой тест на котором он может ссыпатся, а система которая тестирует код пишет деление на 0
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
01.03.2010, 21:21 4
Скорее всего, проблема в устаревшем компиляторе. Вероятно, это Turbo C какой-нибудь древний. Там в стандартных библиотеках была одна фиговина для определения скорости процессора, а современные процессоры будут всё-таки побыстрее 8086-х... Пользуйся Visual Studio или свободными IDE вроде Code::Blocks, DevC++ или что там в соответствующей теме посоветуют.
0
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
01.03.2010, 21:40  [ТС] 5
нет, компилятор MSVS2005

Добавлено через 36 секунд
код отлаживался на MSVS2008
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,167
02.03.2010, 11:05 6
Цитата Сообщение от breate Посмотреть сообщение
for(int i=0;i<epsilon;++i)
{
int di=i+i;
while(j<epsilon)
{
if(a[j][di]<a[j-1][di])
Не кажется ли вам, что сдесь вылет за пределы массива?)
0
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
02.03.2010, 17:53  [ТС] 7
Цитата Сообщение от kazak Посмотреть сообщение
Не кажется ли вам, что сдесь вылет за пределы массива?)
нет, не кажется, точно не вылезет так как память на строку выделяется с помощью (dn+1) а dn=n+n+2;
на самом деле у меня неправильна математика, до меня допёрло, что если подставить следующий тест
Код
0 1 0 0
1 0 0 0
0 0 0 1
0 0 1 0
то ответ будет не верен так как матрица программой будет приведена к
Код
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
как можно заметить ответ YES а на самом деле NO

Добавлено через 1 минуту
хотя нет пример не удачный

Добавлено через 3 минуты
просто в низу должно быть типо
Код
..
0 0 0 0 1
0 0 0 1 0
0
14 / 14 / 5
Регистрация: 02.03.2010
Сообщений: 29
02.03.2010, 23:57 8
На досуге попытался решить задачку. Вышло вроде покороче, хз как с правильностю роботы. Пример решает верно и эту матрицу тоже :
0 1 0 0
1 0 0 0
0 0 0 1
0 0 1 0


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
#include <stdio.h>
#include <stdlib.h>
 
int main ()
{
 
    FILE *instream;
    instream=fopen("in.txt","r");
    FILE *outstream;
    outstream=fopen("out.txt","w");
    int N,**a;
 
    fscanf(instream,"%d",&N);
 
    a=(int **)calloc(N,sizeof(int*));
    for( int i=0;i<N;i++) a[i]=(int *)calloc(N,sizeof(int));
 
    for(i=0;i<N;i++)
    {
        for(int k=0;k<N;k++) fscanf(instream,"%d",&a[i][k]);
    }
 
    for(i=0;i<N;i++)
    {
        for(int k=0;k<N;k++)
        if(a[i][k]==1) 
        {
            for(int t=0;t<N;t++)
            {
                if(t==i) continue;
                if(a[k][t]==1&&a[i][t]==1) 
                {
                    fprintf(outstream,"NO\n");
                return 1;
                }
            }
        }
    }
    fprintf(outstream,"YES\n");
    
    return 1;
    
}
Как видно из алгоритма, я пытаюсь найти сразу не логичность, то есть, если 1 знаком с 2, значит они в разных группах и если 1 знаком с 3, и 2 тоже знаком с 3 - значит разделить на две группы незнакомых их нельзя.
1
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
03.03.2010, 03:41  [ТС] 9
конечно спасиб за идею,я пока продвину свою теорию, потом помучаю вашу(я сам как маньяк эти задачи решаю с удовольствием), тесты выполняются на матрицах 5*5 и 10*10; нужно уложится максимум в 1 секунду и вывести людей находящихся в одной группе.
0
03.03.2010, 03:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2010, 03:41
Помогаю со студенческими работами здесь

Деление
Помогите пожалуйста. нужно поделить деньги

Деление на 0
Здравствуйте, есть код: #include &lt;iostream&gt; int main(){ int temp, zero = 0; int...

Деление на 6
Люди, не могу понять, неужели я такой никчема? Задача: Заданы N целых чисел. Определить сумму...

Деление на 2^16
Нужно разделить 2х байтовое число на 2^16, очевидно, что делитель больше и получиться дробное...


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

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

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