Идеальный квадрат и идеальный куб

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

c++,algorithm,math,integer,integer-arithmetic,

8

Ответов: 8


13 принят

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

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

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!
";

Изменить: или вообще:

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

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

#include<math.h>
int isperfect(long n)
{
    double xp=sqrt((double)n);
    if(n==(xp*xp))
        return 1;
    else
        return 0;
}

1

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

Если вы хотите, чтобы она была быстрой и не использовала функции float / double, упомянутые в большинстве ответов, затем закодируйте двоичный поиск, используя только целые числа. Если вы можете найти n с n ^ 2 <m <(n + 1) ^ 2, то m не является идеальным квадратом. Если m - идеальный квадрат, то вы найдете n с n ^ 2 = m. Проблема здесь обсуждается


0

Для определения квадратов я пробовал этот алгоритм в java. С небольшим различием синтаксиса вы можете сделать это и на c ++. Логика заключается в том, что разница между каждыми двумя последовательными совершенными квадратами возрастает на 2. Diff (1,4) = 3, Diff (4,9) = 5, Diff (9,16) = 7, Diff (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;


     }

  }
C ++, алгоритм, математика, целое число, целое число, арифметика,
Похожие вопросы