考試的時候沒做出來商架,當時太心急了..
當然現(xiàn)在也還沒做出來qaq,差最后一個測試點沒過硝逢,目前還沒發(fā)現(xiàn)問題所在(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> //獨立性就是中轉次數(shù)(素數(shù)*2)
#include<string.h>
int num[100005]={0},flag[100005]={0},TIMES[100005]={0},sad=0;
int aa,bb;
int prime(int a) //判斷素數(shù)
{
for(int i=2;i<=sqrt(a);i++)
if(a%i==0)
return 1; //返回1不是素數(shù)
return 0; //返回0是素數(shù)
}
void judge(int a)
{
memset(flag,0,10005); //flag數(shù)組用于判斷對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)) //不是素數(shù)
TIMES[A]=times;
else //素數(shù)
TIMES[A]=2*times;
for(int i=aa;i<=bb;i++)
{
if(i==A)
continue;
if(flag[i]==1)
num[i]-=9999999; //num[i]是負數(shù)表示是被用過的數(shù)字
}
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) //不許依附于其它幸福數(shù)
{
printf("%d %d\n",i,TIMES[i]);
sad=1;
}
if(sad==0)
printf("SAD");
return 0;
}