【牛客】快手2020校园招聘秋招笔试--算法A试卷

链接:https://www.nowcoder.com/questionTerminal/c8cfc98711a14a3fbc587ca5aabc09ee
来源:牛客网

[编程题]计算累计平方和.
热度指数:361时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M

给定一个32位int型正整数,我们定义如下操作,取其十进制各位数字的平方和,并不断重复这个操作。如果某次操作完成后得到的结果是1,则返回true;否则继续执行,直到证明永远不会得到结果为1,返回false
input:19

output:true

原因:

1^2 + 9^2=82

8^2 + 2^2 = 68

6^2 + 8^2 = 100

1^2 + 0^2 + 0^2 = 1

链接:https://www.nowcoder.com/questionTerminal/c8cfc98711a14a3fbc587ca5aabc09ee
来源:牛客网

输入描述:
输入一个m(1<=m<=1000),表示查询组数。

接下来m行,每一行为一个32位int型正整数。

输出描述:
对于每次查询,如果满足题目描述,则输出"true",反之输出"false" (不要输出引号)
示例1
输入
2
19
7
输出
true
true

题目解析

输入一个数如何判断累计平方和不为1 ? 如果进行一次平方和以后和不为1把当前值记录,重复n次后和为第一次和的值,那么就表示该数的平方和不可能为1。

#include<iostream>
#include<vector>
#include<list>


using namespace std;

bool Find(int x, list<int> List)
{
	for (list<int>::iterator iter = List.begin(); iter != List.end(); iter++)
	{
		if (*iter == x)
		{
			return true;
		}
	}
	return false;
}
bool isOne(int num, int(*lib)[2], list<int> List)
{
	if (num == 1) return true;
	//这里最重要的就是判断什么时候是false,其实就是循环了
	//每次判断list中是否已经含有当前数字,如果有,那就不可能为1了;
	if (Find(num, List))
	{
		return false;
	}
	//并且插入num
	List.push_back(num);
	int n = 0;
	while (num > 0){
		int tmp = num % 10;
		n += lib[tmp][1];
		num /= 10;
	}
	return isOne(n, lib, List);
}

int main()
{
	//建立一个二维数组,提高后面平方的运算速度
	int (*lib)[2] = new int[10][2];
	for (int i = 0; i < 10; i++) {
		lib[i][0] = i;
		lib[i][1] = i*i;
	}
	//输入数据
	int n;
	int x;
	vector<int> arr;
	while (cin >> n)
	{
		//扩容否则无法存放输入数据
		arr.resize(n);
		for (int i = 0; i < n; i++)
		{
			cin >> x;
			arr[i] = x;
		}
		//判断输入数据
		for (int i = 0; i < n; i++)
		{
			list<int> List;
			if (isOne(arr[i], lib, List))
			{
				cout << "true" << endl;
			}
			else
			{
				cout << "false" << endl;
			}
		}
	}
	system("pause");
	return 0;
}
发布了33 篇原创文章 · 获赞 102 · 访问量 3990

猜你喜欢

转载自blog.csdn.net/famur/article/details/105049968