考试的时候没做出来,当时太心急了..
当然现在也还没做出来qaq,差最后一个测试点没过,目前还没发现问题所在(19-4-9)
题目链接:
https://pintia.cn/problem-sets/994805046380707840/problems/1111914599412858886
解题思路:
注释给的很清晰了,这里再画给图
(我个人偏爱的标记方式是-=999999和+=1)
![$9238HKM6]`0FNAK5VKGR2H.png](https://upload-images.jianshu.io/upload_images/16989852-4f44e6c81699ba5f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
没有ac的代码:
#include<stdio.h>
#include<math.h> //独立性就是中转次数(素数*2)
#include<string.h>
int num[100005]={0},flag[100005]={0},TIMES[100005]={0},sad=0;
int aa,bb;
int prime(int a) //判断素数
{
for(int i=2;i<=sqrt(a);i++)
if(a%i==0)
return 1; //返回1不是素数
return 0; //返回0是素数
}
void judge(int a)
{
memset(flag,0,10005); //flag数组用于判断对a是否回头路
int times=0,A=a,tag=0;
while(a!=1)
{
int sum=0;
while(a)
{
sum=sum+pow((a%10),2);
a/=10;
}
a=sum;
times++;
if(flag[a]==1||num[a]==-1) //不走回头路,也不走前人摔下的路
{
tag=1;
num[A]=-1;
break;
}
flag[a]=1;
}
if(tag==1)
return;
if(prime(A)) //不是素数
TIMES[A]=times;
else //素数
TIMES[A]=2*times;
for(int i=aa;i<=bb;i++)
{
if(i==A)
continue;
if(flag[i]==1)
num[i]-=9999999; //num[i]是负数表示是被用过的数字
}
num[A]+=1; //负多正少是扭转不了什么的
}
int main()
{
scanf("%d%d",&aa,&bb);
for(int i=aa;i<=bb;i++)
judge(i);
for(int i=aa;i<=bb;i++)
if(num[i]>0) //不许依附于其它幸福数
{
printf("%d %d\n",i,TIMES[i]);
sad=1;
}
if(sad==0)
printf("SAD");
return 0;
}