模拟赛第一题


</pre><pre name="code" class="cpp">


循环数

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

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

    重复这样做 (这次从“6”开始数6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是2.   

    再这样做 (这次数2个): 8 1   

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

    又一次(这次数3个): 6 2 8  这时你回到了起点。

如果你从每一个数字开始数一次以后没有回到起点, 你的数字不是一个循环数。  

给你一个数字 M (在 1到9位之间), 找出第一个比 M 大的循环数, 并且一定能用一个无符号长整型数装下。  

 

文件输入   

仅仅一行, 包括M   

 

文件输出

仅仅一行,包括第一个比 M 大的循环数。

 

样例输入   

81361   

 

样例输出   

81362   

水题没啥好说的,无脑模拟然而注意要从m+1开始因为m本身也可能是循环数。。。我就因此坑掉1个点

</pre><pre name="code" class="cpp">

#include<cstdio>
#include<cstring>
#include<iostream>
short int a[10];
bool b[10];
int len;
bool qq()                      //判断有无重复的数字
{
  int i,j;
  for (i=0;i<=len-1;i++)
    for (j=i+1;j<=len;j++)
      if (a[i]==a[j]) return false;
  return true;
}
bool xhs(long long n)
{
  int i,j;
  int c[10];
  len=-1;
  while (n!=0)         //转在数组里存
  {
    len++;
    c[len]=n%10;
    if (c[len]==0) return false;
    n/=10;
  }
  for (i=0;i<=len;i++)     //方向跳过来
    a[i]=c[len-i];
  if (qq()==false) return false;
  memset(b,0,sizeof(b));       //记录有无足迹 0为无 1为有
  i=0; j=0;
  do
  {
    j++;
    b[(i+a[i])%(len+1)]=1;             //核心算法
    i=(i+a[i])%(len+1);
  }while(j<len+1);
  for (i=0;i<=len;i++)       //是否全部经过
    if (b[i]==0) return false;
  return true;
}
int main()
{
  long long old;
  freopen("runround.in","r",stdin);
  freopen("runround.out","w",stdout);
  scanf("%lld",&old);old++;
  while (xhs(old)==false) old++;
  printf("%lld\n",old);
  return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值