70,020
社区成员




#include <iostream>
#include <vector>
using namespace std;
vector <int> cyj; // 保存符合要求的数字。
vector <int> tt; // 临时数组。
int a[5000001]; // 用于标记符合要求的数字1表示是,0表示不是。
void judge(int n)
{
tt.insert(tt.begin(),n); //先将n插入tt数组。
if(n==1||a[n]==1) // 如果n==1或者n为已经标记的数字则执行一下语句。
{
for(int j=0;j<tt.size();j++) // 遍历tt数组
{
if(a[tt[j]]==0) // 如果tt[j]的值未被标记则
{ // 标记该数字,并且将值插入cyj数组。
a[tt[j]]=1;
cyj.insert(cyj.begin(),tt[j]);
}
}
tt.clear(); // 清空tt数组,返回。
return ;
}
int m=n; // 用m 保留n的原值
int sum=0;
while(n>0) // 将n每位数字提取并把平方的值与sum相加。
{
int t=n/10;
sum+=t*t;
n/=10;
}
if(sum>m) // 如果sum大于n原来的值则该数不符合要求直接返回。
{
return ;
tt.clear();
}
else // 否则
{
judge(sum);
}
if(sum<10&&sum!=1) // 如果sum小于10且不等于1则返回。
{
tt.clear();
return ;
}
}
int main()
{
int T;
cin>>T;
while(T--) // T为测试次数
{
memset(a,0,sizeof(a)); // a数组初始化为0
int n;
cin>>n;
if(n==1) //1,和小于10的情况单独考虑。
{
cout<<'1'<<endl;
continue;
}
else if(n<10)
{
cout<<'2'<<endl;
continue;
}
a[1]=1; // 1,10是符合要求的数字 。
a[10]=1;
cyj.insert(cyj.begin(),1); // 因为题目规定有两个1所以cyj里面插入两个1.
cyj.insert(cyj.begin(),1);
for(int i=10;i<=n;i++)
{
if(a[i]==1) continue; // 如果i是已经标记的数则继续循环。
judge(i);
}
cout<<cyj.size()<<endl;
}
return 0;
}
if(n==1) //1,和小于10的情况单独考虑。
{
cout<<'1'<<endl;
continue;
}
else if(n<10)
{
cout<<'2'<<endl;
continue;
}
//ACM.C
#include "stdio.h"
int N = 10000; //求10000范围内的符合条件的个数。
int array[550];
//下面这个函数返回一个指定数据的位平方和。
int square(int num)
{
int n;
n = 0;
while(num != 0)
{
n = n + (num % 10) * (num % 10);
num /= 10;
}
return n;
}
//递归函数
int judge(int num, int i)
{
int ret;
// printf("%d %d\n", num, i);
num = square(num);
if (num == 1)
return 1;
if (num > 550)
return 0;
if (array[num] == 1)
return 1;
else if (array [num] != 0)
return 0;
array[num] = i;
ret = judge(num, i);
if ( ret == 1)
array [num] = 1;
return ret;
}
void main()
{
int count, i;
//清除标志
for (i = 0; i < 550; i ++)
array[i] = 0;
//循环N次。
for (i = 1, count = 0; i <= N; i++)
{
//对每个数据进行判断是否符合条件
if (judge(i, i) == 1)
{
count ++; //符合条件者,计数器加1.
// printf("%d is ok\n", i);
}
// else
// printf("%d is not ok!\n", i);
}
printf("count= %d\n", count);
return;
}
//ACM.C
#include "stdio.h"
int N = 10000; //求10000范围内的符合条件的个数。
int array[550];
//下面这个函数返回一个指定数据的位平方和。
int square(int num)
{
int n;
n = 0;
while(num != 0)
{
n = n + (num % 10) * (num % 10);
num /= 10;
}
return n;
}
//递归函数
int judge(int num, int i)
{
// printf("%d %d\n", num, i);
num = square(num);
if (num == 1)
return 1;
if (num > 550)
return 0;
if (array[num] == 1)
return 1;
else if (array [num] != 0)
return 0;
array[num] = i;
return judge(num, i);
}
void main()
{
int count, i, j;
//清除标志
for (i = 0; i < 550; i ++)
array[i] = 0;
//循环N次。
for (i = 1, count = 0; i <= N; i++)
{
//对每个数据进行判断是否符合条件
if (judge(i, i) == 1)
{
count ++; //符合条件者,计数器加1.
//将其涉及的所有标志置1,以供后来的数据使用。
for(j = 0; j < 550; j ++)
{
if (array[j] == i)
array[j] = 1;
}
// printf("%d is ok\n", i);
}
// else
// printf("%d is not ok!\n", i);
}
printf("count= %d\n", count);
return;
}