Для определения квадратов я попробовал этот алгоритм в 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;
}
}