计蒜客循环数

题目链接:点击打开链接

循环数是那些不包括0且没有重复数字的整数(比如81362)并且还应同时具有一个有趣的性质, 就像这个例子: 8 1 3 6 2

如果你从最左边的数字开始(在这个例子中是8)向右数最左边这个数(如果数到了最右边就回到最左边),你会停止在另一个新的数字(如果没有停在一个不同的数字上,这个数就不是循环数).就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以我们得到的下一个数字是6。

重复这样做 (这次往后6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是我们得到了2

再这样做 (这次往后数2个): 8 1,我们得到了1.

再一次 (这次往后数1个): 3

又一次: 6 2 8 这时你回到了起点,在经过每个数字一次后回到起点的就是循环数。如果你经过每一个数字一次以后没有回到起点, 你的数字不是一个循环数。

给你一个数字 M, 找出第一个比 M大的循环数, 输出数据保证结果能用一个无符号长整型数装下。

输入包括一行,为整数M(0≤M≤100000000)

输出包括一行,为第一个比M大的循环数。

样例输入

81361

样例输出

81362

一定要认真读题。。。。。。。

#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
	long long m;
	int a[30],visit[15],b[30];
	int j,ans,l;
	long long i,n;
	scanf("%lld",&m);
	for(i=m+1;;i++)
	{
		n=i;
		l=0;
		ans=0;
		memset(visit,0,sizeof(visit));
		while(n)
	    {
	      if(n%10==0||visit[n%10]==1)
	      {
	      	ans=1;
	      	break;
		  }
		  visit[n%10]=1;
		  a[l++]=n%10;
		  n/=10;
	    }
	    if(ans==1)
	    continue;
	    for(j=0;j<l;j++)
	    b[j]=a[l-1-j];
	    int p=(b[0]+0)%l;
	    j=0;
	    while(b[p]!=0)
	    {
	    	int u=b[p];
	    	b[p]=0;
	    	p=(u+p)%l;
	    	j++;
		}
		if(j==l)
		{
			printf("%lld\n",i);
			break;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/z2664836046/article/details/79502958
今日推荐