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