数値が任意の数値の2乗であり、キューブと同じであるかどうかを確認するための事前定義された関数がC++にありますか。
9 に答える
いいえ、でも簡単に書くことができます。
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;
}
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;
}
いいえ、整数が完全平方か完全立方かをチェックする標準の c または c++ 関数はありません。
高速化し、ほとんどの回答で言及されている float/double ルーチンの使用を避けたい場合は、整数のみを使用してバイナリ検索をコーディングします。n^2 < m < (n+1)^2 の n を見つけることができる場合、m は完全な正方形ではありません。m が完全な正方形の場合、n^2=m の n が見つかります。問題はここで議論されています
これを試して:
#include<math.h>
int isperfect(long n)
{
double xp=sqrt((double)n);
if(n==(xp*xp))
return 1;
else
return 0;
}
最も効率的な答えはこれかもしれません
int x=sqrt(num)
if(sqrt(num)>x){
Then its not a square root}
else{it is a perfect square}
このメソッドは、x が int であり、整数部分のみを格納するために小数部分をドロップダウンするという事実のために機能します。数値が整数の完全な 2 乗である場合、その平方根は整数になるため、x と sqrt(x) は等しくなります。
正方形を識別するために、Javaでこのアルゴリズムを試しました。構文の違いはほとんどありませんが、C++ でも実行できます。ロジックは、連続する 2 つの完全な正方形ごとの差が 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;
}
}
bool isSquare(int n) {
return floor(sqrt(n)) == ceil(sqrt(n));
}
bool isQube(int n) {
return floor(cbrt(n)) == ceil(cbrt(n));
}