写一个算法来判断一个数是不是"快乐数"。
一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是无限循环但始终变不到1。如果可以变为1,那么这个数就是快乐数。
样例
19 就是一个快乐数。
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
按照题目中说的一共有两种情况,一种情况是一直进行上述操作,然后得到1,要么是无限循环得不到1,那么就按照这个思路,首先while循环判断是否能得到1,然后每一步再判断是否有循环(若有循环,则即是有重复的数,用vector<int>结合find来判断),这样就是可以的:
顺便复习一下std::find函数,在头文件algorithm里。
std::find
template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);
//接受一对迭代器和一个查找目标,返回一个迭代器,如果没找到返回尾后。
bool isHappy(int n)
{
if(n<=0) //小于零的话直接返回错误
return false;
vector<int> res;
while(n!=1) //得不到1 的话就一直循环
{
int num=0; //存算出来的数
while(n>0)
{
num+=(n%10)*(n%10);
n/=10;
} //逐位求平方和,从低位往高位求
if(find(res.begin(),res.end(),num)==res.end())
//这是std::find接受一堆迭代器和一个目标,是一个模板函数
{
res.push_back(num); //如果没找到,就把这个数放进去
}
else
return false; //如果能找到的话说明产生循环了,则肯定更不是快乐数
n=num;
}
//n==1了才可能跳出循环,返回true
return true;
}
思路二,我一开始也想着算几个数试一下,身边没有笔,就没算,后来一查果然无论是快乐或者不快乐,最后都会归结到1或者4,也就是说,只要是一个整数,一直循环进行这个操作,不是最后得到的不是1就是4,那么这样就简单多了,直接循环,得到1或者4跳出,然后根据是1或者4判断是否是快乐数:
code:
bool isHappy(int n) {
if(n<=0)
return false;
while(n!=1&&n!=4)
{
int num=0;
while(n>0)
{
num+=(n%10)*(n%10);
n/=10;
}
n=num;
}
return n==1;
// write your code here
}
over