问题概述
题目:算法-守型数
问题描述:
守形数是这样一种整数,它的平方的低位部分等于它本身。比如25的平方是625,低位部分是25,因此25是一个守形数。编一个程序,判断N是否为守形数.
输入:
输入包括1个整数N,2<=N<100
输出:
可能有多组测试数据,对于每组数据,
输出"Yes!”表示N是守形数。
输出"No!”表示N不是守形数。
样例输入:
6
11
样例输出:
Yes!
No!
1. 问题分析
1.1 算法核心
整数型的分解是整个算法题目的核心要点,因为要比较一个整形术与他的平方数的低位部分是否相同,这就需要我们对整形数进行分解来达到比对的目的;
1.2 算法分析
算法题目解法多种多样,在这里给读者介绍两种解法,一是易理解的数字处理方法,定义两个整形变量,用于存储我们的操作数handlNumber,操作数的平方数handleSquare,每次读入至操作数变量,然后计算操作数的平方,再定义一个标志变量flag,用于标识该操作数是否是守型数。我们是对操作数进行数字处理,也就是每次取操作数及平方数的最低位进行比较,若不相同则标志置为0,退出遍历循环输出提示,若相同则操作数及平方数缩小10倍,也就是把刚刚比较过的那一个低位移出,这样循环操作直到操作数或者平方数中的任意一个为0,说明这个时候有一个数的所有位都已经比较过了,这时候正常退出循环即可,标志位默认是为1的,所以最后判断标志位是否为1,然后进行输出即可;
第二种方法是利用C++的string对象的C++11特性,to_string函数,这个函数可以返回一个string对象,具有多个重载函数,这样我们利用这个函数,把读入的整数转换为字符串对象,然后计算他的平方数,把他的平方数也转换为字符串对象,再利用algorithm头文件里的reverse函数(将传入的字符串反转),将操作数和平方数的字符串对象都进行反转,接着利用string对象的函数compare比较操作数与平方数即可,根据compare函数的返回值不同的输出即可,需要注意的是我们只需要比较平方数的低位部分,所以需要另外的两个变量记录操作数的长度,调用compare函数时传入操作数的长度,这样就只会比较操作数长度的子字符串了,若为0说明相同,若不为0说明不相同;
2. 解决方案
数字处理:
#include <iostream>
using namespace std;
#define maxlength 101
int handleNumber, handleSquare;
int main(void)
{
int flag;
while(scanf("%d", &handleNumber) != EOF)
{
flag = 1;
handleSquare = handleNumber * handleNumber;
while(handleNumber && handleSquare)
{
int cmp1 = handleNumber % 10;
int cmp2 = handleSquare % 10;
if(cmp1 != cmp2)
{
flag = 0;
break;
}
handleNumber /= 10;
handleSquare /= 10;
}
if(flag != 0)
printf("Yes!\n");
else
printf("No!\n");
}
return 0;
}
字符串处理:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <string.h>
using namespace std;
int handleNumber, handleSquare;
int main(void)
{
int flag;
while (scanf("%d", &handleNumber) != EOF)
{
string source = to_string(handleNumber);
handleSquare = handleNumber * handleNumber;
string square = to_string(handleSquare);
reverse(square.begin(), square.end());
reverse(source.begin(), source.end());
int lens = source.length();
if (source.compare(0, lens, square, 0, lens) == 0)
cout << "Yes!" << endl;
else
cout << "No!" << endl;
}
return 0;
}
3. 资源分享
旗木白哉のGitHub:
https://github.com/YangMengHeng
C++ / C源代码下载地址:
https://github.com/YangMengHeng/myCode/tree/master/VSCode
Java源代码下载地址:
https://github.com/YangMengHeng/myCode/tree/master/Java
旗木白哉のblog源代码下载地址:
https://github.com/YangMengHeng/myCode/tree/master/%E6%97%97%E6%9C%A8%E7%99%BD%E5%93%89%E3%81%AEblog