解题报告:ZOJ3457 Absence Number (打表+数学)

题意:

输入n(00到99),求一个最小的正整数ans使得 1/ans 除去前导零的小数位上包含00到99中除了n的所有数。


分析:

n的范围比较小,考虑打表,每个m的小数点后位数最多m次会重复,所以每个m循环m+1次然后进行一次包含数的判断,如果包含了除去某个数的其余所有数,那么m就是对应这个数的答案,用0标识取得最小答案。


#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
/******************************************打表代码***************************************************************
int ans[100];
bool have[100];
int dig[1000000];
int d,num=0;

inline bool pass(){
    for(int i=0;i<100;i++)
        if(!ans[i])return false ;
    return true ;
}



inline void oper(int& value ,int n){
        value*=10;
        int x = value/n;
        dig[d++] = x;
}

inline void get(){
    int x = 0 ;
    for(int i=0;i<d;i++){
        x = ( x*10+dig[i] ) %100;
        have[x] = true;
    }
}

inline void done(int in){
    get();
    int none = 0;int x;
    for(int i=0;i<100&&none<=1;i++){
        if(!have[i]){
            x=i;none++;
        }
    }if(none==1&&!ans[x]){
        ans[x] = in ;num++;
    }
}
*************************************************************************************/
int ANS[100]={
76344,27839,2938,5246,8662,13161,7412,7843,3386,4566,8596,981,1654
,5609,2623,11357,5703,13634,1269,7067,10146,7748,
1017,2006,13987,2737,1007,9269,2191,9633,5637,17406,
4746,327,19798,10219,6902,11815,7869,731,5972,5473,8849,
9822,3222,16274,2751,22414,2183,5974,7573,5391,6837,8762,
7747,1962,5629,9691,10158,1493,1462,15796,3594,8109,2359,14382
,339,6873,19194,10262,5459,5163,20049,4028,3113,27279,1003
,3924,1937,2679,5183,3378,2969,21395,13907,3074,4911,827,6471,4279,2283,8465,2538,527,17751,7526,9422,7345,5083,791
};


int main()
{

    /*********************打表代码
    freopen("data.in","w",stdout);
    for(int n=101;num<100;n++){
        int value = 10;d = 0;
        while(value<n)value*=10;
        memset(have,false,sizeof(have));
        memset(dig,false,sizeof(dig));
        for(int i=0;i<=n&&value;i++){
            oper(value,n) ;
            value %= n;
        }
        done(n);
    }
    for(int i=0;i<100;i++)printf("%d,",ans[i]);

    return 0;
    *********************/
    int n;
    while(scanf("%d",&n)==1){
        printf("%d\n",ANS[n]);
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值