【牛客】快手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
题目解析 【【牛客】快手2020校园招聘秋招笔试--算法A试卷】输入一个数如何判断累计平方和不为1 ? 如果进行一次平方和以后和不为1把当前值记录,重复n次后和为第一次和的值,那么就表示该数的平方和不可能为1。

#include #include #includeusing namespace std; bool Find(int x, list List) { for (list::iterator iter = List.begin(); iter != List.end(); iter++) { if (*iter == x) { return true; } } return false; } bool isOne(int num, int(*lib)[2], list 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 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 List; if (isOne(arr[i], lib, List)) { cout << "true" << endl; } else { cout << "false" << endl; } } } system("pause"); return 0; }

    推荐阅读