TLE错题集

这道题给的深刻教训:
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;
}

发布了28 篇原创文章 · 获赞 0 · 访问量 668

猜你喜欢

转载自blog.csdn.net/weixin_45561591/article/details/103434026
tle