2012-04-14 2 views
1

Мне нужно сделать программу, которая принимает число и выводит из него квадратный корень. Пример - 45 -> 3√5. Я сделал программу, но она просто возвращает тот же номер, что и я. Помощь была бы весьма признательна. Вот мой код ->Программа, которая вычисляет квадратные корни числа.

#include<iostream> 
using namespace std; 


int squarerootfinder(int number, int divisor){ 
    if(divisor == 1){ 

      return 1; 
    } 
    else{ 

      if((number/(divisor * divisor))% 1 != 0){ 

        divisor = squarerootfinder(number, divisor - 1); 

      } 
      if((number/ (divisor * divisor)) % 1 == 0){ 
      return divisor; 

      } 

     } 

} 
int main(){ 
    int number; 
    cout << "Enter a number to find the square root of it \n"; 
    cin >> number; 
    int divisor = number; 
    int squareroot; 
    squareroot = squarerootfinder(number, divisor); 
    cout << squareroot << endl; 
    return 0; 
} 
+0

Какие попытки были предприняты для отладки проблемы? –

+0

Ну, я читал это за последние полчаса, но я не могу найти, где ошибка. Я полагаю, что что-то не так с рекурсией функции. Но я не уверен, что должен делать. –

+1

Если у вас есть доступ к отладчику, вы хотите пройти через выполнение программы, соблюдая поток выполнения и состояние переменных в ключевых точках этого потока. В противном случае откройте консоль или файл журнала, чтобы выполнить одно и то же. –

ответ

2

две проблемы с этой линии и связанные с целочисленного типа:

if((number/(divisor * divisor))% 1 != 0){

Помня о том, что результат операции целочисленного является целым числом, что является значение первого набора значений, которые входят в функцию? Предположим, number 5. Тогда мы имеем:

5/(5*5) = 5/25 = 0

То же самое относится с % 1. ints всегда целые числа, поэтому modding by 1 всегда возвращает 0.

+1

скорее, modulo 1 всегда возвращает ноль. Он ничего не делает * ничего *, он ничего * ничего полезного *. –

+0

@BenVoigt true. Ничего полезного. – mydogisbox

-2

Проблема здесь заключается в использовании правильного алгоритма, и вам нужно использовать заголовок cmath в библиотеке std в вашей функции squareRootFinder. Вы также можете использовать функцию для получения целого числа. Вот мой код. Надеюсь, поможет.

#include <iostream> 
#include <cstring> 
#include <cmath> 


using namespace std; 

int getPositiveInt(string rqstNum) 
    { 
     int num; 
     do 
     { 
      cout << rqstNum << endl; 
      cin >> num; 
     }while(num == 0); 

     return num; 
    } 


double squareRootFinder(double Num) 
    { 
     double squareroot; 
     squareroot = sqrt(Num); 
     return squareroot; 
    } 

int main() 
{ 
int Num = getPositiveInt("Enter a number and i'll calculate the squareroot "); 
double squareroot = squareRootFinder(Num); 

    // To dispay the answer to two decimal places we cast the squareroot variable 
    squareroot *= 100; 
    squareroot = (double)((int)squareroot); 
    squareroot /= 100; 
    cout << squareroot << endl; 

    return 0; 
} 
+0

Вы исправили больше, чем упоминаете в своем вступительном параграфе. –

Смежные вопросы