游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1938|回复: 7

求教,请问这道题应该怎样做

[复制链接]

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-11-29 18:56:00 | 显示全部楼层 |阅读模式
这是今年noip普及组复试的一题,请问大家应该怎样写代码?(c/c++)
循环
(circle.pas/c/cpp)



【问题描述】



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

众所周知,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。



版权所有:中国计算机学会

1

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2005-11-29 20:39:00 | 显示全部楼层

Re: 求教,请问这道题应该怎样做

#include<math.h>
#include<iostream.h>
//code Pigface
void PigMul(unsigned int temp[30],unsigned int b)
{
        int i;
        unsigned long int t,t2;
        t2 = 0;
        for(i=0;i<30;i++)
        {
                t = (unsigned long)temp * b;
                temp = (t)%10000 + t2;
                t2 = (t)/10000;//jinwei
        }
}//一个大整形数和一个小的整形数的乘法
int  getwei(unsigned int a,int x)
{
       unsigned int t1,t2;

       t1 = a % (unsigned int)pow(10,x+1);
       t2 =  t1/(unsigned int)pow(10,x);
       return (int)t2;
}//取一个整形数的一个十进制位
int PigJudge(unsigned int temp1[30],unsigned int temp2[30],int num)
{
        int i,j;
        for(i=0;i<num/4;i++)
        {
                if(temp1 != temp2) return 0;
        }
        for(j=0;j<num%4;j++)
        {
                if(getwei(temp1,j) != getwei(temp2,j)) return 0;
        }
        return 1;
}//用于判断大数是否相等

void main()
{
        unsigned int temp1[30] = {0};
        unsigned int temp2[30] = {0};
        int i,count;
        unsigned int n;
        int k;
        while(cin>>n>>k)
        {
                for(i=0;i<30;i++)
                {
                        temp1 = 0;
                        temp2 = 0;
                }//init
                temp1[0] = n;
                temp2[0] = n;

                PigMul(temp1,n);
                count = 1;
                while(!PigJudge(temp1,temp2,k))
                {
                        PigMul(temp1,n);
                        count ++;
                }
                cout<<count<<"\n";
        }
}


我的思路是这样的:由于每次都是乘同一个数,所以只要当结果等于N时就可以肯定以后就都是循环的了。所以只要每次乘完以后取最后K位进行比较就可以了。我自己找了多个数据测试通过,不知道还有没有什么没考虑到的地方,拿这个去试试,希望可以Accept。

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2005-11-30 12:35:00 | 显示全部楼层

Re:求教,请问这道题应该怎样做

满足不了数据规模...
你用的long型数据才42亿 ,而k就有100位...所以算法不用看也知道通不过

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-11-30 12:51:00 | 显示全部楼层

Re:求教,请问这道题应该怎样做

就是呀,我也这样想,但它出了这道题,该怎样解呀?

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-11-30 13:15:00 | 显示全部楼层

Re:求教,请问这道题应该怎样做

请问是不是没位数字一个空间?即short NUM[100]用来保存尾数才能做出这道题?

5

主题

217

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2005-11-30 22:53:00 | 显示全部楼层

Re:求教,请问这道题应该怎样做

可以自已写一个数字封装
也可以直接用char数组来保存
具体算法不想写了..最近写的程序太多
心理发毛
见量
哈哈

5

主题

217

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2005-11-30 22:56:00 | 显示全部楼层

Re:求教,请问这道题应该怎样做

用short有点浪费
但思想也没错

1

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2005-12-1 11:57:00 | 显示全部楼层

Re:求教,请问这道题应该怎样做

谁说不能满足了???看清楚点
void PigMul(unsigned int temp[30],unsigned int b);
}//一个大整形数和一个小的整形数的乘法
结果全存在temp[30]里呢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 19:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表