2013-04-12 3 views
1

Я новичок в языке C, и я пытаюсь сделать лабораторный учебник, который мы получили в uni.Basic C Program, Babylonian Algorithm

Мы попросили сделать следующее:

Задача 1. Вавилонская алгоритм для вычисления квадратного корня из числа п следующим образом: 1. Сделать предположение в ответ (вы можете выберите n/2 в качестве своего первоначального предположения).

  1. Вычислить г = п/догадаться
  2. Набор догадку = (догадку + R)/2
  3. вернуться к шагу 2 на столько итераций, сколько необходимо. Чем больше этапов 2 и 3 повторяется , тем ближе будет угадать квадратный корень из n.

Написать программу, которая вводит целое число для п, итерации через вавилонский алгоритм пять раз, и выводит ответ в виде двойного до двух знаков после запятой. Ваш ответ будет наиболее точным при малых значениях n.

Вот что я написал:

#include <stdio.h> 
#include <math.h> 

int n; 

main(void){ 
    printf("Enter a value for n: "); 
    scanf("%d",&n); 
    double guess = n/2; 
    for (int i = 0; i < 5; i++) { 
     double r = n/guess; 
     double guess = (guess + r)/2; 
    } 
    printf("%d",guess); 
} 

Где я не так? Он выплескивает смешные результаты; например, если я вводю «4» в виде n, ответ должен быть около «2», но каждый раз он дает разные огромные результаты.

ответ

2

Немногое здесь не так.

Во-первых, вы включили второй экземпляр guess внутри цикла. Уберите в этой строке объявление double. Так оно и должно стать:

guess = (guess + r)/2; 

Во-вторых, потому, что guess является double вам нужно использовать %f вместо %d в printf вызова.

printf("%f", guess); 

После того, как вы получите его работы, рассмотреть возможность запуска алгоритма до определенной точности не будет достигнута.

const double epsilon = 0.0001; 
double guess = (double)n/2.0; 
double r = 0.0; 
while(fabs(guess * guess - (double)n) > epsilon) 
{ 
    r = (double)n/guess; 
    guess = (guess + r)/2.0; 
} 
+0

Спасибо, это сработало, оба ответа были на деньги; как я могу его распечатать до 2 десятичных знаков? –

+0

Спецификатор формата '"% .2f "'. Выясните, нужен ли вам ''% .2lf''. Я думаю, что float неявно преобразуется в double в списки переменных аргументов. – paddy

+0

Спасибо, помощник. Spot on –

2

Вавилонская алгоритм кажется неправильным для меня, это должно быть так,

int i; 
    float n,guess=1; 

    printf("\nEnter the Number: "); 
    scanf("%f",&n); 
    for(i=0;i<PRECISION;i++) 
    { 
     guess=(guess+n/guess)/2; 
    } 
    printf("\nThe Square root of %f is %f",n,guess); 

Существуют и другие возможные ошибки также в вашей программе,

Там может быть проблема целочисленного деления,

линия double guess = n/2;

double guess = (double) n/2; должен быть

Также printf() должен быть printf("%lf",guess);

+1

Стоит отметить, что этот ответ адреса нежелательное поведение для ввода меньше двух, из-за деления на ноль: 'double r = n/guess;'. Вероятно, должна быть проверка, чтобы обеспечить 'n> 0', прежде чем входить в этот цикл. – Sebivor

3

Другим решением было бы:

guess = guess/2.0; 

Это будет "сила" операция с плавающей точкой.

И переменная guess уже входит в сферу применения. Вы не можете его обновить (как в цикле). Вы можете установить только новое значение.

И вам также нужно изменить printf на: эту ссылку

printf("%f",guess); 

Проверить для получения дополнительной информации о PRINTF форматтеров:

http://www.cplusplus.com/reference/cstdio/printf/