Консультация № 175300
15.12.2009, 19:25
35.00 руб.
0 8 1
Доброго времени суток!
Необходимо написать программку на C++ (желательно, чтобы работала на VS 2008). Задача такая: дано натуральное n. Подсчитать количество решений неравенства x*x + y*y < n в натуральных (неотрицательных целых) числах, не используя действий с вещественными числами.
Заранее благодарен.

Обсуждение

давно
Специалист
246813
155
15.12.2009, 19:51
общий
это ответ
Здравствуйте, starcode.
Комментарии в программе
Код:
#include <iostream>
using namespace std;

int main(){
int n,x,y,k;
locale::global(locale("russian_russia.866")); // Чтобы печатать русскими буквами
wcout<<L"Введите число n: ";
cin>>n;
k=0;
for(x=0;x<=n;x++){
for(y=0;y<=n;y++){
if(x*x+y*y<n){cout<<"("<<x<<","<<y<<")\n";k++;}//если заданные координаты удовлетворяют неравенству, то выводим их на экран. Эти координаты как раз и будут решением.
}
}
wcout<<L"Количество решений неравенства x*x+y*y<n в натуральных числах, не используя действий с вещественными числами:"<<k;

wcout<<L"\nДля выхода нажмите любую клавишу...\n";
return 0;
}
Неизвестный
15.12.2009, 20:31
общий
LfiN:
А зачем до n перебирать-то? Можно и поменьше.
давно
Специалист
246813
155
15.12.2009, 20:33
общий
lupus campestris:
Согласен, просто на "скорую руку" делал.
Неизвестный
15.12.2009, 21:27
общий
LfiN:
как же будет выглядеть финальная программа?
давно
Специалист
246813
155
15.12.2009, 21:49
общий
starcode:
Можете смело брать программу в ответе. Она работает по принципу "чтобы наверняка"
Если же желаете чтобы программа выполняла меньше действий можете взять этот код[$8595$]
Код:
#include <iostream>
#include <cmath>
using namespace std;

int main(){
int n,x,y,k;
locale::global(locale("russian_russia.866")); // Чтобы печатать русскими буквами
wcout<<L"Введите число n: ";
cin>>n;
k=0;
for(x=0;x<=sqrt(n);x++){
for(y=0;y<=sqrt(n);y++){
if(x*x+y*y<n){cout<<"("<<x<<","<<y<<")\n";k++;}//если заданные координаты удовлетворяют неравенству, то выводим их на экран. Эти координаты как раз и будут решением.
}
}
wcout<<L"Количество решений неравенства x*x+y*y<n в натуральных числах, не используя действий с вещественными числами:"<<k;

wcout<<L"\nДля выхода нажмите любую клавишу...\n";
return 0;
}

Рад был помочь!
Неизвестный
16.12.2009, 12:19
общий
LfiN:
Ага, уже лучше. :)
Я бы еще подумала насчет 0 и насчет того, что там есть симметричные решения, соответственно можно в 2 раза меньше перебирать.
Неизвестный
16.12.2009, 20:10
общий
Если не трудно, можно пояснить, что означают значения в скобках ( , ) при выполнении программы?
давно
Специалист
246813
155
16.12.2009, 20:31
общий
starcode:
Перед запятой в скобках записывается значение х, после запятой значение у. Если их подставить в указанное неравенство x*x+y*y<n, то оно будет выполняться.
Например, мы ввели n=2, то программа перебирает все возможные варианты начиная с нуля 0*0+0*0=0<2, потом счетчик у увеличивает значение на единицу а х остается без изменений 0*0+1*1=1<2, условие выполняется и опять увеличиваем у на единицу{это по программе написанной в ответе. в мини-форуме этот случай уже исключается} получаем 0*0+2*2=4>2 условие не выполняется. Увеличиваем счетчик х на единицу а у обнуляется, теперь неравенство имеет вид 1*1+0*0=1<2, потом счетчик у увеличивает значение на единицу а х остается без изменений 1*1+1*1=2=2 условие уже не выполняется. В итоге мы имеем (0,0),(0,1),(1,0)-это 3 решения данного неравенства при n=2.
Хотя условие задачи просит просто подсчитать количество решений, но для большей наглядности я решил вывести и сами решения.
Рад был помочь!
Форма ответа