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

Не могу найти ошибку - C++

Восстановить пароль Регистрация
 
kkk008009kkk
46 / 46 / 1
Регистрация: 24.03.2011
Сообщений: 315
05.04.2012, 04:13     Не могу найти ошибку #1
Добрый день.

Имеется задача:
Дано натуральное n. Подсчитать количество решений неравенства x2 + y2 < n в натуральных (неотрицательных целых) числах, не используя действий с вещественными числами.
Написал код:

#include <stdio.h>
#include <conio.h>

main()
{
int i,x,y,z,o;
scanf("%d",&z);
o=0;
for (x=0;x<=z;x++) {
for (y=0;y<=z;y++) {
if (x*x+y*y<=z) o++;
}}
printf("%d",o);
getch();
}


Но вычисляет он неверно. Объясните, пожалуйста, в чем ошибка.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2012, 04:13     Не могу найти ошибку
Посмотрите здесь:

C++ Не могу найти ошибку
C++ Не могу найти ошибку.
C++ Не могу найти ошибку
C++ Не могу найти ошибку!
Не могу найти ошибку C++
C++ Не могу найти ошибку
C++ Не могу найти ошибку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.04.2012, 04:37     Не могу найти ошибку #2
Так x2 это x в квадрате или все таки x * 2? Для этого кстати на форуме есть BB code )

Добавлено через 8 минут
Вот пример для x2 + y2 < n:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cmath>
 
/*
 *
 */
int main() {
    int n = 100, count = 0, lim = 0;
 
    lim = std::sqrt( n );
 
    for ( int x = 0; x < lim; x++ ) {
        for ( int y = 0; y < lim; y++ )
        if ( x * x + y * y < n ) {
        count++;
        std::cout << count << ": " << x << " * " << x << " + " << y << " * " << y << " = " << ( x * x + y * y ) << std::endl;
        }
    }
    
    return 0;
}
Думаю понятно почему предел до которого считаем x и y это корень из n?
ATEUCT
18 / 18 / 2
Регистрация: 28.02.2012
Сообщений: 35
05.04.2012, 04:38     Не могу найти ошибку #3
для таких ошибок используется вывод промежуточных результатов, там и найдёшь в чём проблема
kkk008009kkk
46 / 46 / 1
Регистрация: 24.03.2011
Сообщений: 315
05.04.2012, 09:05  [ТС]     Не могу найти ошибку #4
Toshkarik, Что это за программа? В любом случае, она ничего не считает. Хотя бы для n=3.

Возможно, я что-то не понял.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.04.2012, 15:19     Не могу найти ошибку #5
Вот немного подправил, нужно считать до корня включительно. Так же немного изменил вывод, что бы было более понятно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cmath>
 
/*
 *
 */
int main() {
    int n = 3, count = 0, lim = 0;
 
    lim = std::sqrt( n );
 
    std::cout << "x * x + y * y < n\nn = " << n << std::endl;
 
    for ( int x = 0; x <= lim; x++ ) {
        for ( int y = 0; y <= lim; y++ )
            if ( x * x + y * y < n ) {
                count++;
                std::cout << count << ": ( x = " << x << ", y = " << y << " )    " << x << " * " << x << " + " << y << " * " << y << " = " << ( x * x + y * y ) << std::endl;
            }
    }
 
    return 0;
}
При n == 3.
kkk008009kkk
46 / 46 / 1
Регистрация: 24.03.2011
Сообщений: 315
05.04.2012, 19:26  [ТС]     Не могу найти ошибку #6
Toshkarik, Теперь все понял. Спасибо. В принципе, и моя программа правильная, просто условия не до конца понял вчера.


Думаю понятно почему предел до которого считаем x и y это корень из n?
Да.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
05.04.2012, 19:33     Не могу найти ошибку #7
только вычисление корня - это операция с вещественным числом =)
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.04.2012, 20:06     Не могу найти ошибку #8
Nekto, есть перегрузка функции которая принимает целочисленный параметр, но возвращает все равно double. Но в программе используются только целочисленные переменные, я думаю это и имелось ввиду в задании. Если не использовать вычисление корня то алгоритм будет просто не эффективным. Хотя может есть еще какой то способ, математику подзабыл немного.
kkk008009kkk
46 / 46 / 1
Регистрация: 24.03.2011
Сообщений: 315
05.04.2012, 21:03  [ТС]     Не могу найти ошибку #9
Но в программе используются только целочисленные переменные, я думаю это и имелось ввиду в задании.
Да, это имелось ввиду.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
05.04.2012, 21:06     Не могу найти ошибку #10
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
#include <iostream>
using namespace std;
int main()
{
 setlocale(LC_ALL,"Russian");
 cout<<"Enter n: ";
 int n;
 cin>>n;
 cout<<"x*x + y*y < n\nxВєN, yВєN"<<endl;
 int count=0;
 for (int i=1;2*i*i<n ;i++)
  {
   count++;
   cout<<"x="<<i<<" y="<<i<<endl;
   for (int j=i+1;j*j+i*i<n; j++)
    {
     count+=2;
     cout<<"x="<<i<<" y="<<j<<endl;
     cout<<"x="<<j<<" y="<<i<<endl;
     }
  }
 cout<<count<<" results\n";
 system("pause");
 return 0;
}
Не уверен с границами циклов, надо подумать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2012, 21:24     Не могу найти ошибку
Еще ссылки по теме:

Не могу найти ошибку C++
C++ Не могу найти ошибку
C++ Не могу найти ошибку
C++ Не могу найти ошибку!
Не могу найти ошибку C++

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.04.2012, 21:24     Не могу найти ошибку #11
Вы наверно имели ввиду вот это
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
/*
 *
 */
int main() {
    int n = 3, count = 0;
 
    std::cout << "x * x + y * y < n\nn = " << n << std::endl;
 
    for ( int x = 0; x * x < n ; x++ ) {
        for ( int y = 0; y * y < n; y++ )
            if ( x * x + y * y < n ) {
                count++;
                std::cout << count << ": ( x = " << x << ", y = " << y << " )    " << x << " * " << x << " + " << y << " * " << y << " = " << ( x * x + y * y ) << std::endl;
            }
    }
 
    return 0;
}
Но проблема в том, что выражения x * x и y * y считаются на каждой итерации циклов.
Yandex
Объявления
05.04.2012, 21:24     Не могу найти ошибку
Ответ Создать тему
Опции темы

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