2.2.3 RUNAROUND NUMBERS 循环数

PS:最近工作比较忙,所以把以前在学校做acm的时候写的一些解题报告发出来

http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2327

题目大意:(如题)

输入输出:(如题)

解题思路:从开始数后一个数往后枚举,然后判断其是不是循环数,如果是就输出退出。

void transfer() //转换函数,将整数的每一位数提取出来
{
    int i;
    n=0;
    while(tmp>0)
    {
        i=tmp%10;
        tmp/=10;
        tmpstr[n]=i;
        n++;
    }
    for(i=0;i<=n;i++)
        str[i]=tmpstr[n-i];
} 

void check()
{
    int i,j,k;
    for(i=0;i<10;i++)
        mrk[i]=0;
    for(i=1;i<=n;i++)
        mrk[str[i]]++;
    for(i=0;i<=9;i++)
    {
        if(mrk[i]>1) //数里面有位数的数字重复
        {
            flag=false;
            return;
        }
    }
    j=1;
    for(i=0;i<10;i++)
        mrk[i]=0;
    for(i=1;i<=n;i++) //每位数判断
    {
        k=str[j];
        j=(str[j]+j)%n; //循环
        if(!j)j+=n;
        if(mrk[j]!=0||str[j]==k) //不满足循环数的条件或者已经判断过了,往后走k步出现的数和k相同
        {
            flag=false;
            return;
        }
        mrk[j]=1; //标记判断过了
    }
    if(j==1)
    {
        flag=true;
        return;
    }
} 
时间: 2024-11-07 08:50:50

2.2.3 RUNAROUND NUMBERS 循环数的相关文章

USACO Section 2.2 Runaround Numbers

/* ID: lucien23 PROG: runround LANG: C++ */ #include <iostream> #include <fstream> #include <cstring> using namespace std; int main() { ifstream infile("runround.in"); ofstream outfile("runround.out"); if(!infile || !

洛谷 P1467 [USACO2.2]循环数 Runaround Numbers

题目描述 循环数是那些不包括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

usaco Runaround Numbers

题意为一个数从最左边开始,往右数这个位上的个数个,然后这样走一圈,回到起点,每个数字都访问过且只访问一次,这个数字就是循环数 要求找出第一个比N大的循环数 /* ID: modengd1 PROG: runround LANG: C++ */ #include <iostream> #include <math.h> #include <stdio.h> #include <memory.h> using namespace std; bool isarro

USACO Section2.2 Runaround Numbers 解题报告 【icedream61】

runround解题报告------------------------------------------------------------------------------------------------------------------------------------------------[题目] 给你一个数M,找出第一个比它大的循环数. 循环数:不包括0.没有重复数字,并且有循环性质的正整数. 循环性质:以81362为例 1.找到最高位,是8,那么往下数8位,依次是1,3

USACO Runaround Numbers 模拟

根据题意的 Runaround 规则去找比当前数大的最近的一个 Runaround数字 模拟题~ Source code: /* ID: wushuai2 PROG: runround LANG: C++ */ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <fstream>

【USACO 2.2】Runaround Numbers

找出第一个大于n的数满足:每一位上的数都不同,且没有0,第一位开始每次前进当前这位上的数那么多位,超过总位数就回到开头继续往前进,最后能不能每个位都到过一次且回到第一位,$n<10^9$. 暴力,每次n++后模拟一边判断是否符合条件. /* TASK:runround LANG:C++ */ #include<cstdio> #include<cstring> using namespace std; int n; int get(int now,int step,int l

2.2.3 Runaround Numbers

没什么好说的强行搜索.具体细节看代码. 代码如下: /* ID: awsd1231 PROG: runround LANG: C++ */ #include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std; unsigned long M; bool check(unsigned long x) { char buf[10]; sprintf(

USACO--2.2Runaround Numbers

开始的时候认为数据太大,直接模拟会超时,但其实还是可以直接模拟的,原因在于这种Runaround Numbers分布还比较稠密.另外要注意读题. 代码如下: /* ID:15674811 LANG:C++ PROG:runround */ #include<iostream> #include<cstdio> #include<cstring> #include<fstream> using namespace std; int conut(int *vis

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive