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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
breate
56 / 56 / 2
Регистрация: 23.10.2009
Сообщений: 250
#1

Деление на 0 - C++

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

задача:
Условие

Имеется 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2010, 19:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Деление на 0 (C++):

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

Деление - C++
Надо разделить на два заданное четное натуральное число с количеством цифр меньше 100. Нужно использовать не арифметические, а символьные...

Деление в С++ - C++
Добрый день :) Написал программу, которая будет вычислять винрейт в дота 2: int win; int lose; int all(0); double winrate(0.0); ...

деление на 0 - C++
у меня есть код задачи .. помогите пожалуйста.. надо переделать код, чтобы в 14 строчке (case '/': cout&lt;&lt;&quot;4astka\t&quot;&lt;&lt;b/c&lt;&lt;endl; break;)...

Деление - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;conio.h&gt; using namespace std; char *fortunes = {&quot;Its ok\n&quot;, &quot;Very good\n&quot;,...

деление на 0 - C++
столкнулся с проблемой деления на 0. нужно сделать так. чтобы программа не делила на 0. по средством switch не получалась. вот код ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
insideone
Модератор
Автор FAQ
3639 / 918 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
01.03.2010, 20:04 #2
Забавно, а у меня код отработал правильно (под этим я понимаю что нету ошибок и Пример входных данных дает Пример выходных данных). VS 2008
0
breate
56 / 56 / 2
Регистрация: 23.10.2009
Сообщений: 250
01.03.2010, 20:23  [ТС] #3
да у меня тоже код работает правильно, и я не могу найти такой тест на котором он может ссыпатся, а система которая тестирует код пишет деление на 0
0
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
01.03.2010, 21:21 #4
Скорее всего, проблема в устаревшем компиляторе. Вероятно, это Turbo C какой-нибудь древний. Там в стандартных библиотеках была одна фиговина для определения скорости процессора, а современные процессоры будут всё-таки побыстрее 8086-х... Пользуйся Visual Studio или свободными IDE вроде Code::Blocks, DevC++ или что там в соответствующей теме посоветуют.
0
breate
56 / 56 / 2
Регистрация: 23.10.2009
Сообщений: 250
01.03.2010, 21:40  [ТС] #5
нет, компилятор MSVS2005

Добавлено через 36 секунд
код отлаживался на MSVS2008
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
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
breate
56 / 56 / 2
Регистрация: 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
archinko
14 / 14 / 2
Регистрация: 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
breate
56 / 56 / 2
Регистрация: 23.10.2009
Сообщений: 250
03.03.2010, 03:41  [ТС] #9
конечно спасиб за идею,я пока продвину свою теорию, потом помучаю вашу(я сам как маньяк эти задачи решаю с удовольствием), тесты выполняются на матрицах 5*5 и 10*10; нужно уложится максимум в 1 секунду и вывести людей находящихся в одной группе.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2010, 03:41
Привет! Вот еще темы с ответами:

Деление - C++
Оригинал условия тут Входной файл input.txt: Первая строка-количество фирм Вторая строка-доходы фирм Третья строка-налог на фирмы(в...

Деление на 41 - C++
Надо сделать программу на C, которая печатает все пятизначные числа, которые делится из 41 и которых циклично переставляя полученные числа...

Деление - C++
Оригинальное задание звучит так: Вот, что я наваял: //The program divides the first number by the second one. //It should...

Деление на 1 - C++
Здравствуйте! В программ есть операция которая делит числа на 1, чтобы найти частоту. Так вот, например, когда я делю 1/186 ответ выдает...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.03.2010, 03:41
Ответ Создать тему
Опции темы

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