C++博客 :: 首页 :: 新随笔 ::  ::  :: 管理

PKU1047(ZZ)

Posted on 2010-08-18 21:14 Kevin_Zhang 阅读(185) 评论(0)  编辑 收藏 引用 所属分类: 数论
http://acm.pku.edu.cn/JudgeOnline/problem?id=1047
#include <cstdlib>
#include <iostream>

using namespace std;

typedef struct  
{//存放大整数.题目要求为60位,必须自己定义
    int digits[100];
    int len;
}big;

big  getone(char str[100])
{//将输入的字符串转换成big类型并返回
    big res;
    int len=strlen(str);
    res.len=len;
    for(int i=0;i<len;i++)
    {
        res.digits[len-i-1]=str[i]-'0';//数在digits中倒序存储
    }
    return res;
}

big  mult(big b,int c)
{//大整数的乘法
    big res;
    res.len=b.len;
    memset(res.digits,0,sizeof(res.digits));
    for (int i=0;i<res.len;i++)
    {
        res.digits[i]+=b.digits[i]*c;//乘法处理.结果每一位不一定都是1位
    }
    for (int i=0;i<res.len;i++)
    {
        if (res.digits[i]>9)
        {
            res.digits[i+1]+=res.digits[i]/10;//处理进位
            res.digits[i]=res.digits[i]%10;//模除,余数为该为上的数
            while(res.digits[res.len]!=0) res.len++;
        }
    }
    return res;
}

bool  add_one(big  b)
{//剪枝处理
    //剪枝原理:原数*(数长+1)=99….9(长度为原数长度+1)
    big one;
    one.len=0;
    memset(one.digits,0,sizeof(one.digits));
    one=mult(b,b.len+1);
    if(one.len>b.len)
        return 0;
    else
    {
        one.digits[0]+=1;
        for (int i=0;i<one.len;i++)
        {
            if (one.digits[i]>9)
            {
                one.digits[i+1]+=one.digits[i]/10;
                one.digits[i]=one.digits[i]%10;
                while(one.digits[one.len]!=0) one.len++;
            }
        }
        if(one.len!=b.len+1)//如果为999...9形式,加1后必进位,因此不需要继续判断
            return 0;
        else
            return 1;
        
    }
    return 0;
}

big move_one(big b)
{//将big类型的数向左移动一位.原来的第一位放到最后一位.用于和原数比较
    int len=b.len;
    int a=b.digits[0];
    for (int i=0;i<len-1;i++)
    {
        b.digits[i]=b.digits[i+1];
    }
    b.digits[len-1]=a;
    return b;
}

bool comp(big b,big c)
{//不叫两个big类型的数是否相等.相等返回1,否则返回0
    bool a=1;
    if (b.len!=c.len)
        a=0;
    else
    {
        for (int i=0;i<b.len;i++)
        {
            a=a&&(b.digits[i]==c.digits[i]);
            if(!a)
                return a;
        }
    }
    return a;
}

int main(int argc, char *argv[])
{
    char str[100];
    bool a=0;//标记!
    while (cin>>str)//处理输入
    {
        big one;
        one=getone(str);
        if(!add_one(one))//剪枝,可以剪除99%的非数cyclic数
        {
            a=0;
        }
        else
        {
            big two=one;
            for (int i=1;i<one.len;i++)
            {
                two=mult(one,i+1);
                for (int j=0;j<one.len;j++)
                {    
                    two=move_one(two);//每移动一次,比较一次
                    a=a || comp(two,one);//只要一次比较成功,就将a设置为1表示成功
                    if(a)
                        break;
                }
            }
        }
        if(a)
            cout<<str<<" is cyclic"<<endl;
        else
            cout<<str<<" is not cyclic"<<endl;
    }

    //system("PAUSE");
    //return EXIT_SUCCESS;
}

只有注册用户登录后才能发表评论。
相关文章:
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理