USACO 2.2.3 Runaround Numbers 循环数
来源:互联网 发布:vb中str是什么意思 编辑:程序博客网 时间:2024/05/17 23:54
Problem H: 2.2.3 Runaround Numbers 循环数
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 9 Solved: 5
[Submit][Status][Web Board]
Description
循环数是那些不包括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. 再这样做 (这次数两个): 8 1 再一次 (这次一个): 3 又一次: 6 2 8 这是你回到了起点, 在从每一个数字开始数1次之后. 如果你在从每一个数字开始数一次以后没有回到起点, 你的数字不是一个循环数。 给你一个数字 M (在1到9位之间), 找出第一个比 M大的循环数, 并且一定能用一个无符号长整形数装下。
Input
仅仅一行, 包括M
Output
仅仅一行,包括第一个比M大的循环数。
Sample Input
81361
Sample Output
81362
解题思路: 模拟题
将大整数用数组存起来。从n++开始循环
1、数组中出现0,continue;
2、数组中出现某两个数相等,continue;
3、a[a[i]+i]==a[i],continue;
4、数组中从任一个数开始都能循环到起点,并且将所有数遍历一遍。
代码:
/*
ID:ytjiang1
TASK:runround
LANG:C++
*/
#include <fstream>
#include <iostream>
using namespace std;
int a1[20],a2[20];
int visit[20];
long long n;
long long i,j;
int bool1,bool2,bool3,bool4;
int r,s,t,k,k1;
int main()
{
ifstream fin("runround.in");
ofstream fout("runround.out");
fin>>n;
while(n++)
{
i=n;
t=1;
j=100000000;
bool3=0;
while(j>0)
{
if(i/j<=0 && bool3==0)
{
j/=10;
continue;
}
bool3=1;
a1[t++]=i/j;
i=i%j;
j/=10;
}
bool1=1;
for(r=1;r<t;r++)
{
if(a1[r]==0)
{
bool1=0;
break;
}
}
if(bool1==0)
continue;
for(r=1;r<t;r++)
{
for(s=r+1;s<t;s++)
{
if(a1[r]==a1[s])
{
bool1=0;
break;
}
}
if(bool1==0)
break;
}
if(bool1==0)
continue;
for(r=1;r<t;r++)
{
k1=(a1[r]+r)%(t-1);
if(k1==0)
k1=t-1;
if(a1[k1]==a1[r])
{
bool1=0;
break;
}
}
if(bool1==0)
continue;
//cout<<"bool1="<<bool1<<endl;
for(r=1;r<t;r++)
{
for(s=1;s<t;s++)
visit[s]=0;
s=r;
bool2=0;
k1=(s+a1[s])%(t-1);
if( (s+a1[s])%(t-1)==0)
k1=t-1;
while(visit[k1]==0)
{
if(k1==r)
{
visit[k1]=1;
bool4=1;
for(k=1;k<t;k++)
{
if(visit[k]==0)
{
bool4=0;
break;
}
}
if(bool4==0)
break;
bool2=1;
break;
}
//cout<<"t="<<t<<" (s+a1[s])%(t-1)= "<<k1<<endl;
//cout<<a1[k1]<<" ";
visit[k1]=1;
s=k1;
k1=(s+a1[s])%(t-1);
if((s+a1[s])%(t-1)==0)
k1=t-1;
//cout<<"s="<<s<<endl;
//for(k=1;k<t;k++)
//cout<<visit[k]<<" ";
}
//cout<<"bool2="<<bool2<<endl;
if(bool2==0)
{
bool1=0;
break;
}
}
if(bool4==0)
continue;
if(bool1==0)
continue;
//cout<<"hahaha..........."<<endl;
if(bool1==1)
fout<<n<<endl;
break;
}
return 0;
}
解题思路: 模拟题
将大整数用数组存起来。从n++开始循环
1、数组中出现0,continue;
2、数组中出现某两个数相等,continue;
3、a[a[i]+i]==a[i],continue;
4、数组中从任一个数开始都能循环到起点,并且将所有数遍历一遍。
代码:
/*
ID:ytjiang1
TASK:runround
LANG:C++
*/
#include <fstream>
#include <iostream>
using namespace std;
int a1[20],a2[20];
int visit[20];
long long n;
long long i,j;
int bool1,bool2,bool3,bool4;
int r,s,t,k,k1;
int main()
{
ifstream fin("runround.in");
ofstream fout("runround.out");
fin>>n;
while(n++)
{
i=n;
t=1;
j=100000000;
bool3=0;
while(j>0)
{
if(i/j<=0 && bool3==0)
{
j/=10;
continue;
}
bool3=1;
a1[t++]=i/j;
i=i%j;
j/=10;
}
bool1=1;
for(r=1;r<t;r++)
{
if(a1[r]==0)
{
bool1=0;
break;
}
}
if(bool1==0)
continue;
for(r=1;r<t;r++)
{
for(s=r+1;s<t;s++)
{
if(a1[r]==a1[s])
{
bool1=0;
break;
}
}
if(bool1==0)
break;
}
if(bool1==0)
continue;
for(r=1;r<t;r++)
{
k1=(a1[r]+r)%(t-1);
if(k1==0)
k1=t-1;
if(a1[k1]==a1[r])
{
bool1=0;
break;
}
}
if(bool1==0)
continue;
//cout<<"bool1="<<bool1<<endl;
for(r=1;r<t;r++)
{
for(s=1;s<t;s++)
visit[s]=0;
s=r;
bool2=0;
k1=(s+a1[s])%(t-1);
if( (s+a1[s])%(t-1)==0)
k1=t-1;
while(visit[k1]==0)
{
if(k1==r)
{
visit[k1]=1;
bool4=1;
for(k=1;k<t;k++)
{
if(visit[k]==0)
{
bool4=0;
break;
}
}
if(bool4==0)
break;
bool2=1;
break;
}
//cout<<"t="<<t<<" (s+a1[s])%(t-1)= "<<k1<<endl;
//cout<<a1[k1]<<" ";
visit[k1]=1;
s=k1;
k1=(s+a1[s])%(t-1);
if((s+a1[s])%(t-1)==0)
k1=t-1;
//cout<<"s="<<s<<endl;
//for(k=1;k<t;k++)
//cout<<visit[k]<<" ";
}
//cout<<"bool2="<<bool2<<endl;
if(bool2==0)
{
bool1=0;
break;
}
}
if(bool4==0)
continue;
if(bool1==0)
continue;
//cout<<"hahaha..........."<<endl;
if(bool1==1)
fout<<n<<endl;
break;
}
return 0;
}
- USACO 2.2.3 Runaround Numbers 循环数
- USACO:2.2.3 Runaround Numbers 循环数
- 2.2.3 RUNAROUND NUMBERS 循环数
- [USACO 2.2.3] Runaround Numbers
- USACO 2.2.3 Runaround Numbers
- USACO 2.2.3 Runaround Numbers
- Runaround Numbers循环数
- USACO--2.2Runaround Numbers
- USACO 2.2 Runaround Numbers
- USACO 2.2 Runaround Numbers
- USACO 2.2Runaround Numbers
- USACO 2.2 Runaround Numbers
- USACO section 2.2 Runaround Numbers
- USACO 2.2 Runaround Numbers (runround)
- USACO Section 2.2 Runaround Numbers
- USACO Section 2.2 Runaround Numbers
- USACO - 2.2 Runaround Numbers(枚举)
- USACO 2.2.3 Runaround Numbers(枚举+模拟)
- 基于BVH驱动的OGRE骨骼动画
- string对象易错点
- HDU 1852 Beijing 2008 数论
- 2013 多校第六场 hdu 4662 MU Puzzle
- 使用autoit解决webdriver文件上传问题
- USACO 2.2.3 Runaround Numbers 循环数
- hdu1104Remainder (BFS)
- Struts2 <s:actionerror>标签覆盖
- 一道C机试题目
- 使用ocx(host ocx)
- ios开发第一篇 简单的qq登录窗口
- python优化
- rails 的 Helpers
- android 中写rom文件命名时一点小小的总结