这道题给的深刻教训:
pow也是很耗时间的……
P1611 循环的数字
刚开始也是无从下手,还是老办法,先解决核心问题:给定一个数,求它的所有循环数。解决这个问题之后,剩下的思路也就有了。(除了查重……orz)
而且像x=1111、2222这样的特殊情况完全不用特判,因为它的循环数还是它本身,而题目要求x必须大于a小于b,这样就直接筛出去了
#include<stdio.h>
#include<string.h>
int num[8];
int y[8];
int a,b;
int ans=0;
int vis[10];
bool check(int p){
for(int i=0;i<=9;i++)
if(p==vis[i]) return 0;
return 1;
}
void solve(int x){//now是循环的断点
int pos=0,t=x;
while(t>0){num[++pos]=t%10;t=t/10;}
memset(vis,0,sizeof(vis));
int k=0;//当前x的循环数个数计数
for(int j=pos-1;j>=1;j--){
int pos_y,result;
pos_y=result=0;
for(int i=j;i>=1;i--) y[++pos_y]=num[i];
for(int i=pos;i>=j+1;i--) y[++pos_y]=num[i];
//将求出的循环数处理成整型,与a、b比较,并查重
for(int i=1;i<=pos_y;i++) {
//原本这里写的是 result+=y[i]*pow(10,pos_y-i);
//超时了
if(i==1) result=y[1];
else {
result*=10;
result+=y[i];
}
}
if(result>x&&result<=b&&check(result)) {
vis[++k]=result;
//printf("(%d) %d,%d\n",ans,x,result);
ans++;
}
}
}
int main()
{
scanf("%d%d",&a,&b);
for(int i=a;i<=b;i++) solve(i);//遍历之间的每一个数
printf("%d",ans);
return 0;
}