zoukankan      html  css  js  c++  java
  • 循环

    Problem 2 : 循环

    (circle.pas/circle.in/circle.out)

    【问题描述】

    乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。

    众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:

    循环

    循环长度

    2

    2、4、8、6

    4

    3

    3、9、7、1

    4

    4

    4、6

    2

    5

    5

    1

    6

    6

    1

    7

    7、9、3、1

    4

    8

    8、4、2、6

    4

    9

    9、1

    2

    这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?

    注意:

    1.  如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0。

    2.  如果循环长度是L,那么说明对于任意的正整数a,n的a次幂和a + L次幂的最后k位都相同。

    【输入文件】

    输入文件circle.in只有一行,包含两个整数n(1 <= n < 10100)和k(1 <= k <= 100),n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。

    【输出文件】

    输出文件circle.out包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。

    【样例输入】

    32 2

    【样例输出】

    4

    【数据规模】

    对于30%的数据,k <= 4;

    对于全部的数据,k <= 100

    我的想法

    只与最后k位有关,对n先取模,然后模拟.30分

    正解:

    从最后一位开始,求出满足最后一个的乘几个n,设为x个,然后再乘x个n,2x个n,直到满足倒数最后第二个数,乘1~9,如果都没出现,那么-1.

    我的程序(未AC)

    #include<iostream>
    #include<cmath>
    using namespace std;
    
    void in(long long &x)
    {
        long long y=1;
        char c=getchar();x=0;
        while(c>'9'||c<'0')
        {
            if(c=='-')
            y=-1;
            c=getchar();
        }
        while(c>='0'&&c<='9')
        x=x*10+c-'0',c=getchar();
        x*=y;
    }
    
    void out(long long x)
    {
        if(x<0)
        {
            putchar('-');
            x=-x;
        }
        if(x>9)out(x/10);
        putchar(x%10+'0');
    }
    
    long long n,k,t,l;
    
    long long Pow(long long x,long long y)
    {
        long long t=1;
        for(long long i=1;i<=y;i++)
          t*=x;
          return t;
    }
    
    int main()
    {
        freopen("circle.in","r",stdin);
        freopen("circle.out","w",stdout);
        in(n),in(k);
        if(n<0)
        {
                cout<<"-1"<<endl;
                return 0;
        }
        n%=Pow(10,k);
        t=n;
        while(1)
        {
            l++;
            t*=n;
            t%=Pow(10,k);
            if(t==n)
            {
            out(l);
            break;
            }
            if(l>1000000)
            {
                cout<<"-1"<<endl;
                break;
            }
        }
        return 0;
    }
  • 相关阅读:
    设计模式总结
    字符编码小结
    搞定java.io
    将代码托管到GitHub上
    linuxlinux 路由表设置 之 route 指令详解 路由表设置 之 route 指令详解
    linux子系统的初始化_subsys_initcall()
    Linux系统目录结构介绍
    EtherType :以太网类型字段及值
    socket编程原理
    linux下的网络接口和网络桥接
  • 原文地址:https://www.cnblogs.com/war1111/p/7500498.html
Copyright © 2011-2022 走看看