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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2010, 18:22   #1
vilison
Пользователь
 
Аватар для vilison
 
Регистрация: 30.01.2010
Сообщений: 29
По умолчанию Нужен совет или альтернатива.

Задача:
реализовать вычисление квадратного корня, веденного числа (число вводится пользователем), без использования встроенных функций языка, с точностью до двадцатого знака после запятой.
Пишу соответственно на С++, вот результаты моих нападений на задачу:
Код:
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
float W=0;
int c=0;
cin>>W;
c=W;
c=c/2;
while (c^2!=W){
if (c^2<W){
c=(W+c)/2;
}
c=c/2;
}
cout<<c<<"Конец";
	return 0;
}
// Этот вариант вообще не пошел, я не смог справится ни с алгоритмом, ни с функциями языка.
Вот этот вариант пошел немного дальше:
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	double a=0,b=0,c=0;
	cin>>b;
	for (;a*a!=b;a=a+0.1)
	{
		cout<<a;
	}
	return 0;
}
Но, его проблемой стало то, что подсчет он будет вести очень долго.
Есть еще варианты очень похожи на эти два, так сказать неудачные разработки.
Теперь собственно ближе к вопросу, Я уже не с большим запасом времени и вспомнил цитату "одна голова хорошо, а две лучше".
З.Ы. Надеюсь что ничего на форуме не нарушил.
Спортсмен, который себя любит, должен насиловать себя тренировками!

Последний раз редактировалось Stilet; 16.10.2010 в 19:35.
vilison вне форума Ответить с цитированием
Старый 16.10.2010, 18:48   #2
_ILYA_
Пользователь
 
Аватар для _ILYA_
 
Регистрация: 12.10.2010
Сообщений: 79
По умолчанию

попробуй
Код:
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	double chislo=0;
	double otvet=0;
	double e=0.1; // точность поставь сам
	cin>>chislo;
	otvet=chislo/2;

// старый код
	while ((otvet*otvet)<(chislo+e) && (otvet*otvet)>(chislo-e)) {

// Новый код
	while ((otvet*otvet)>(chislo+e) && (otvet*otvet)<(chislo-e)) {
		if ((otvet*otvet)<chislo) otvet *=1.5;
		if ((otvet*otvet)>chislo) otvet /=2; }
	cout<<otvet<<" Конец";
	return 0;
}
Данный код предложенны по тому что он "деревянный" и я вно будет чуствоватся что написан самостоятельно. А герон будет быстро и красиво но явно с учебника
Имею хитрый план по личному обогащению

Последний раз редактировалось _ILYA_; 16.10.2010 в 19:16.
_ILYA_ вне форума Ответить с цитированием
Старый 16.10.2010, 19:02   #3
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Или по формуле Герона:
Код:
#include <iostream>
using std::cout;
using std::endl;
using std::cin;

int main()
{
	double a(0.0);
	cout << "Input the number: ";
	cin >> a;
	
	if(!a)
	{
		cout << "Result: 0" << endl;
		return 0;
	}
	
	double x(a);
	for(int i=0; i<1000; i++)
		x = 0.5*(x+a/x);

	cout << "Result: " << x << endl;
	system("pause");

	return 0;
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 16.10.2010, 19:05   #4
vilison
Пользователь
 
Аватар для vilison
 
Регистрация: 30.01.2010
Сообщений: 29
По умолчанию

_ILYA_
Результат огорчающий, программа просто делит число на 2 и выводит это как ответ.
Я попробую найти, может что то в коде пропущено?

Syuf
Супер, БЛАГОДАРЮ!!!!
Осталось только понять как настроить точность.
system("pause") - это обязательно?
В вижуал есть прекрасная функция "using namespace std;", ну что бы не писать аж в три строчки.
Спортсмен, который себя любит, должен насиловать себя тренировками!

Последний раз редактировалось vilison; 16.10.2010 в 19:15.
vilison вне форума Ответить с цитированием
Старый 16.10.2010, 19:17   #5
_ILYA_
Пользователь
 
Аватар для _ILYA_
 
Регистрация: 12.10.2010
Сообщений: 79
По умолчанию

попробуй
Код:
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	double chislo=0;
	double otvet=0;
	double e=0.1; // точность поставь сам
	cin>>chislo;
	otvet=chislo/2;

// старый код
	while ((otvet*otvet)<(chislo+e) && (otvet*otvet)>(chislo-e)) {

// Новый код
	while ((otvet*otvet)>(chislo+e) && (otvet*otvet)<(chislo-e)) {
		if ((otvet*otvet)<chislo) otvet *=1.5;
		if ((otvet*otvet)>chislo) otvet /=2; }
	cout<<otvet<<" Конец";
	return 0;
}
Данный код предложенны по тому что он "деревянный" и я вно будет чуствоватся что написан самостоятельно. А герон будет быстро и красиво но явно с учебника
Имею хитрый план по личному обогащению
_ILYA_ вне форума Ответить с цитированием
Старый 16.10.2010, 19:52   #6
vilison
Пользователь
 
Аватар для vilison
 
Регистрация: 30.01.2010
Сообщений: 29
По умолчанию

код:
int _tmain(int argc, _TCHAR* argv[])
{ double a(0.0);
cout<<"Vvedite koren: ";
cin>>a;

if(!a) // Если не равно а?
{
cout << "Rezultat: 0" << endl;
return 0;
}

double x(a);
for(int i=0; i<1000; i++)
x = 0.5*(x+a/x); // если не затруднит, объясните пожалуйста. Почему именно 0.5?

cout << "Rezultat = " << x << endl;
system("pause"); // обязательно?
return 0;
}
Спортсмен, который себя любит, должен насиловать себя тренировками!
vilison вне форума Ответить с цитированием
Старый 16.10.2010, 19:58   #7
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
system("pause") - это обязательно?
В вижуал есть прекрасная функция "using namespace std;", ну что бы не писать аж в три строчки.
system("pause"); - по желанию, только не вашему, а компилятора;
using namespace std; - для маленьких программ(в данном случае возможно) или для больших лентяев, не сведующих великий конфликт вашего воображения, ориентированного на текстовый лад, и такогого Билла Гейтса. (Типа шутачка)
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 16.10.2010, 20:42   #8
vilison
Пользователь
 
Аватар для vilison
 
Регистрация: 30.01.2010
Сообщений: 29
По умолчанию

Ну что то понял.
А откуда 0.5 взяли?!
Я еще не совсем понял код, куда нули пихать надо?
Спортсмен, который себя любит, должен насиловать себя тренировками!
vilison вне форума Ответить с цитированием
Старый 16.10.2010, 20:48   #9
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

if(!a) - это то же, что и if(a == 0): далее надо делить на а, поэтому проверяем на равенство нулю.
Цитата:
А откуда 0.5 взяли?!
Формула Герона
Цитата:
Я еще не совсем понял код, куда нули пихать надо?
Какие еще нули?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 16.10.2010, 20:57   #10
vilison
Пользователь
 
Аватар для vilison
 
Регистрация: 30.01.2010
Сообщений: 29
По умолчанию

Я написал, что после запятой должно быть 20 чисел.
Это одно из условий там...
Это надо где то вписать?
Спортсмен, который себя любит, должен насиловать себя тренировками!
vilison вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен совет hestika Софт 1 20.08.2015 16:30
Нужен совет! Энжи Помощь студентам 1 24.04.2010 20:05
Нужен совет Михаил Юрьевич Общие вопросы Delphi 3 04.05.2008 21:52