问题描述
大概翻译一下问题,就是说对于一个数字,如果将它的各个位数相加,再与其自身相加,就会得到一个新的数字。例如:75+7+5=87,则我们说87是由75产生的数字。
但是有一些数字他们只能产生其他数字,而不能通过其他数字产生,这些数字我们称为self-numbers。本题要求我们找出1-10000中的所有self-numbers.
题目分析
题目很像一个嵌套问题,我们假设一个数字产生另一个数字是通过一个函数f,则所以产生的数字就是f(n),f(f(n)),f((f(f(n)))),…所以我们可以遍历1-10000的数字,计算出没一个数字能够产生的那个数。但是这样做会发生超时的现象,因为每个数字都遍历一遍并且都在1-10000之前求产生的数是一个比较耗时间的过程,所以我们就要找到一个节约时间的方法。
我们可以再创建一个数组,这个数组是一个标志某个数字是否被访问过的数组,初始化都为0.
我们再遍历到一个数字的时候先来这个数组中看这个数组是否已经被访问过了,如果访问过了就跳过,没访问过就访问它,这样能节约不少时间。是一个以空间换时间的方法。
代码
#include <iostream>
#include <vector>
using namespace std;
vector<int>visited(10000,0);
int convert(int n)
{
int sum = n;
while(n)
{
sum+=n %10;
n/=10;
}
return sum;
}
int main()
{
int sum;
for(int i = 1;i <= 10000;i++)
{
//我们只对未被访问过的数字,即visited中的0元素进行访问
if(!visited[i-1])
{
sum = i;
while(sum <= 10000)
{
sum = convert(sum);
if(sum > 10000)
break;
visited[sum - 1] = 1;
}
}
}
for(int i = 0;i <= 10000;i++)
{
if(!visited[i])
{
cout<<i+1<<endl;
}
}
return 0;
}