算法-守型数

问题概述


题目:算法-守型数

问题描述:
守形数是这样一种整数,它的平方的低位部分等于它本身。比如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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值