题目大意:注意这几个概念,幸福数,幸福依附于初始数字的幸福数,特立独行的幸福数,独立性,不幸福的数。给定一区间,列出区间内所有的特立独行的幸福数和它的独立性。如果区间内没有幸福数,则输出SAD。
思路:逐个遍历区间内的数字,判断是否是幸福数,若是幸福数则保存在一数组内;并且将该过程中经历的数字标记下来,用来下一步判断是否是特立独行的幸福数。
若数组为空,说明没有幸福数;否则,遍历数组,判断是否是特立独行的幸福数。
提交代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+5;
int a[maxn], b[maxn];
bool ishappy(int t){
int k=t;
bool flag=false;
vector<int>ans(350,0);
vector<int>v;
int cnt=0;
while(2){
int n=t,a=0;
while(n!=0){ a+=(n%10)*(n%10); n/=10; }
t=a;
if(t==1){ cnt++; flag=true; break; }
else{
if(ans[t]==0) { cnt++; ans[t]=1; v.push_back(t);}
else { flag=false; break;}
}
}
if(flag){
b[k]=cnt;
for(int i=0;i<v.size();i++){ a[v[i]]=1; }
}
return flag;
}
bool isprime(int t){
int k=sqrt(t);
if(t==2)return true;
for(int i=2;i<=k;i++){
if(t%i==0)return false;
}
return true;
}
int main(){
int n1,n2;
vector<int>happynum;
scanf("%d%d",&n1,&n2);
for(int t=n1;t<=n2;t++){
if(ishappy(t)){ happynum.push_back(t); }
}
if(happynum.size()>0){
for(int i=0;i<happynum.size();i++){
int t=happynum[i];
if(a[t]==0){
printf("%d ",t);
if(isprime(t)) printf("%d\n",b[t]*2);
else printf("%d\n",b[t]);
}
}
}else{ printf("SAD"); }
return 0;
}
带注释的代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+5;
//数组a的作用:1表示数字i的幸福依附于其它数字
//数组b的作用:记录幸福依附于i的数字的个数
int a[maxn], b[maxn];
bool ishappy(int t){ //判断是否是幸福数
int k=t; //保存值
bool flag=false;
vector<int>ans(350,0); //最大的数为10000,而各位数平方和最大的数为9999,和为324,所以350足够用
vector<int>v;
int cnt=0; //记录依附于它的的幸福数的个数
while(2){
int n=t,a=0;
while(n!=0){ a+=(n%10)*(n%10); n/=10; } //求各位数字平方和
t=a;
if(t==1){ cnt++; flag=true; break; } //是幸福数
else{
if(ans[t]==0) { cnt++; ans[t]=1; v.push_back(t);} //数字没出现过
else { flag=false; break;} //数字出现过,表明出现了死循环,不是幸福数
}
}
if(flag){ //幸福数
b[k]=cnt;
for(int i=0;i<v.size();i++){ a[v[i]]=1; } //把幸福依附于其它数字的数记录下来
}
return flag;
}
bool isprime(int t){
int k=sqrt(t);
if(t==2)return true;
for(int i=2;i<=k;i++){
if(t%i==0)return false;
}
return true;
}
int main(){
int n1,n2;
vector<int>happynum;
scanf("%d%d",&n1,&n2);
for(int t=n1;t<=n2;t++){
if(ishappy(t)){ happynum.push_back(t); }
}
if(happynum.size()>0){ //输出
for(int i=0;i<happynum.size();i++){
int t=happynum[i];
if(a[t]==0){ //特立独行的幸福数
printf("%d ",t);
if(isprime(t)) printf("%d\n",b[t]*2);
else printf("%d\n",b[t]);
}
}
}else{ printf("SAD"); }
return 0;
}
这篇博客探讨了在给定区间内如何找到特立独行的幸福数及其独立性。作者首先定义了幸福数、幸福依附数等相关概念,并提供了一种算法,通过遍历区间内的数字并判断其是否为幸福数,进而筛选出特立独行的幸福数。当区间内不存在幸福数时,输出SAD。最后,展示了带有注释的代码实现。
2085

被折叠的 条评论
为什么被折叠?



