给定一个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
思路:
如果不能出现1 那么最终会到达一个环,即与之前的数字相等
采取set记录之前的方式,复杂度过高,采取快慢指针的方式。
fast=fast->next->next slow=slow->next
#include<iostream>
#include<vector>
#include<set>
using namespace std;
int next(int k)
{
int next=0;
while(k)
{
next+=(k%10)*(k%10);
k/=10;
}
return next;
}
bool fun(int k)
{
int slow=k;
int fast=k;
while(fast!=slow && fast!=1)
{
fast=next(fast);
if(fast==1)
return true;
fast=nexxt(fast);
slow=next(flow);
}
if(fast==1)
return true;
else
return false;
}