Идеальный квадрат и идеальный куб - PullRequest
8 голосов
/ 11 октября 2009

Существует ли какая-либо предопределенная функция в c ++ для проверки того, является ли число квадратом любого числа и одинаково для куба ..

Ответы [ 8 ]

13 голосов
/ 11 октября 2009

Нет, но написать легко:

bool is_perfect_square(int n) {
    if (n < 0)
        return false;
    int root(round(sqrt(n)));
    return n == root * root;
}

bool is_perfect_cube(int n) {
    int root(round(cbrt(n)));
    return n == root * root * root;
}
6 голосов
/ 11 октября 2009

sqrt(x) или вообще pow(x, 1./2) или pow(x, 1./3)

Например:

int n = 9;
int a = (int) sqrt((double) n);
if(a * a == n || (a+1) * (a+1) == n)  // in case of an off-by-one float error
    cout << "It's a square!\n";

Редактировать: или вообще:

bool is_nth_power(int a, int n) {
  if(n <= 0)
    return false;
  if(a < 0 && n % 2 == 0)
    return false;
  a = abs(a);

  int b = pow(a, 1. / n);
  return pow((double) b, n) == a || pow((double) (b+1), n) == a;
}
1 голос
/ 23 марта 2013

Нет, нет стандартных функций c или c ++ для проверки, является ли целое число идеальным квадратом или идеальным кубом.

Если вы хотите, чтобы он был быстрым и избегал использования подпрограмм с плавающей запятой / двойных чисел, упомянутых в большинстве ответов, тогда закодируйте двоичный поиск, используя только целые числа. Если вы можете найти n с n ^ 2 здесь

1 голос
/ 11 ноября 2012

Попробуйте это:

#include<math.h>
int isperfect(long n)
{
    double xp=sqrt((double)n);
    if(n==(xp*xp))
        return 1;
    else
        return 0;
}
0 голосов
/ 06 июля 2018

Самый эффективный ответ может быть таким

    int x=sqrt(num)
    if(sqrt(num)>x){
    Then its not a square root}
    else{it is a perfect square}

Этот метод работает из-за того, что x является целым числом, и он будет опускать десятичную часть, чтобы сохранить только целую часть. Если число является идеальным квадратом целого числа, его квадратный корень будет целым числом, и, следовательно, x и sqrt (x) будут равны.

0 голосов
/ 08 сентября 2017

Мы могли бы использовать встроенную функцию truc -

#include <math.h>

// For perfect square
bool is_perfect_sq(double n) {
    double r = sqrt(n);
    return !(r - trunc(r));
}

// For perfect cube
bool is_perfect_cube(double n) {
    double r = cbrt(n);
    return !(r - trunc(r));
}
0 голосов
/ 22 августа 2016

Для идеального квадрата вы также можете сделать:

if(sqrt(n)==floor(sqrt(n)))
    return true;
else
    return false;

Для идеального куба вы можете:

if(cbrt(n)==floor(cbrt(n)))
    return true;
else
    return false;

Надеюсь, это поможет.

0 голосов
/ 19 мая 2014

Для определения квадратов я попробовал этот алгоритм в Java. С небольшой разницей в синтаксисе вы можете сделать это и в c ++. Логика в том, что разница между каждыми двумя последовательными совершенными квадратами продолжает увеличиваться на 2. Дифф (1,4) = 3, Дифф (4,9) = 5, Дифф (9,16) = 7, Дифф (16,25) ) = 9 ..... продолжается. Мы можем использовать это явление для определения идеальных квадратов. Код Java есть,

    boolean isSquare(int num){
         int  initdiff = 3;
         int squarenum = 1;
         boolean flag = false;
         boolean square = false;
         while(flag != true){

                if(squarenum == num){

                    flag = true;
                    square = true;

                }else{

                    square = false;
                 }
                if(squarenum > num){

                    flag = true;
                }
            squarenum = squarenum + initdiff;
            initdiff = initdiff + 2;
   }
              return square;
 }  

Чтобы ускорить идентификацию квадратов, мы можем использовать другое явление, рекурсивная сумма цифр идеальных квадратов всегда равна 1,4,7 или 9. Так что гораздо более быстрый код может быть ...

  int recursiveSum(int num){
     int sum = 0;   
     while(num != 0){
     sum = sum + num%10;
     num = num/10;         
     }
     if(sum/10 != 0){         
        return recursiveSum(sum);     
     }
     else{
         return sum;
     }

 }
  boolean isSquare(int num){
         int  initdiff = 3;
         int squarenum = 1;
         boolean flag = false;
         boolean square = false;
         while(flag != true){

                if(squarenum == num){

                    flag = true;
                    square = true;

                }else{

                    square = false;
                 }
                if(squarenum > num){

                    flag = true;
                }
            squarenum = squarenum + initdiff;
            initdiff = initdiff + 2;
   }
              return square;
 }  

   boolean isCompleteSquare(int a){
    // System.out.println(recursiveSum(a));
     if(recursiveSum(a)==1 || recursiveSum(a)==4 || recursiveSum(a)==7 || recursiveSum(a)==9){

         if(isSquare(a)){

             return true;

         }else{
             return false;
         }


     }else{

         return false;


     }

  }
...