zoj 3327 Friend Number 模拟题

一年的省赛题目。

先容我骂一下,这题目有病吧,我调试了一个下午+晚上,好不容易才顺利A了,真是坑。

比赛中能做出来的那绝对是厉害啊!!。


我的思路,方法可能有笨:

1.首先判断下有几个0,有一个0的话,

     一  。判断0后面有没有比9小的数,有的话那个数加1就可以直接输出了。

     二  。如果0是最后一位,前面有比9小的数,那个数+1,后面全输出0即可

     三  。如果0是最后一位,前面没有比9小的那直接在最前面加1,后面全输出0即可。

     四  。如果0后面没有比9小的,那直接把0位置变成1,后面都变成0输出即可。

2.如果是有多个0的话

    一。如果在最右0之后有比9小的数,那直接那个数+1 输出答案即可。

    二。如果没有的话,那就直接把这个位置的0变成1,后面全部输出0即可。

3。就是比较一般的情况

    这种是比较简单的。统计因子2 3 5 7 出现的次数。

   因为4可以由 2×2   组成,6可以由 2×3 组成  8 9都可以组成,所以只要保留素数因子即可。

然后直接从后往前面遍历,用直接已经有的因子数,看能不能组成比这个大的,如果可以的话,高位直接不动,这个位置变成这个数。

然后从最后一位开始,把当前拥有因子能组成的最大数组合起来,一个一个往前放,没有因子的话,那都放1就可以了,然后输出答案即可。

如果都没有可能的话,那在这个数前面加1即可。!!!!!!!!!!

!!!!!!!!

比如111126

一开始 a[2]=a[3]=a[5]=a[7]=0;

然后6遍历到6,a[2]++,a[3]++;

因为没有能组成比6 大.

然后遍历2这个时候a[2]=2,a[3]=1;

能组成3那这个位置就放3此时a[2]=2,a[3]=0;

最后一个变成4输出答案即可。

上代码!


#include<string>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[15],b[15];

int f() {
    if(a[3]>=2) { a[3]-=2; return 9;}
    else if(a[2]>=3) { a[2]-=3; return 8;}
    else if(a[7]>=1) { a[7]-=1; return 7;}
    else if(a[2]>=1&&a[3]>=1) { a[2]-=1; a[3]-=1;return 6;}
    else if(a[5]>=1) { a[5]-=1; return 5; }
    else if(a[2]>=2) { a[2]-=2; return 4; }
    else if(a[3]>=1) { a[3]-=1; return 3; }
    else if(a[2]>=1) { a[2]-=1; return 2; }
    else return 1;
}

int fit(int num) {
    if(num==9&&a[3]>=2) { return 1; }
    else if(num==8&&a[2]>=3) { return 1; }
    else if(num==7&&a[7]>=1) { return 1;}
    else if(num==6&&a[3]>=1&&a[2]>=1) { return 1; }
    else if(num==5&&a[5]>=1) { return 1;}
    else if(num==4&&a[2]>=2) { return 1;}
    else if(num==3&&a[3]>=1) { return 1; }
    else if(num==2&&a[2]>=1) { return 1;}
    else return 0;
}
void add(int num)
{
    if(num%2==0) {
        if(num==6) { a[2]++; a[3]++; return ; }
        int temp=num;
        while(temp!=1&&temp%2==0) {
            a[2]++;
            temp/=2;
        }
    }
    else if(num%3==0) {
        int temp=num;
        while(temp!=1&&temp%3==0) {
            a[3]++;
            temp/=3;
        }
    }
    else if(num%5==0) {
        int temp=num;
        while(temp!=1&&temp%5==0) {
            a[5]++;
            temp/=5;
        }
    }
    else if(num%7==0) {
        int temp=num;
        while(temp!=1&&temp%7==0) {
            a[7]++;
            temp/=7;
        }
    }
}
void dd(int num)
{
    if(num%2==0) {
        if(num==6) { a[2]--; a[3]--; return ;}
        int temp=num;
        while(temp!=1&&temp%2==0) {
            a[2]--;
            temp/=2;
        }
    }
    else if(num%3==0) {
        int temp=num;
        while(temp!=1&&temp%3==0) {
            a[3]--;
            temp/=3;
        }
    }
    else if(num%5==0) {
        int temp=num;
        while(temp!=1&&temp%5==0) {
            a[5]--;
            temp/=5;
        }
    }
    else if(num%7==0) {
        int temp=num;
        while(temp!=1&&temp%7==0) {
            a[7]--;
            temp/=7;
        }
    }
}


int main()
{
    //freopen("in","r",stdin);
    //freopen("out","w",stdout);
    int n;
    scanf("%d",&n);
    getchar();
    for(int ww=1; ww<=n; ww++) {
        char str[10005];
        gets(str);
        int i,l=strlen(str);
        int num[10005],flag=0;
        for(i=0; i<l; i++) {
            num[i]=str[i]-'0';
            if(num[i]==0) flag++;
        }
        for(i=0; i<10; i++) a[i]=0;
        int rere;
        if(flag==1) {
            int ff=0,f_f;
            for(i=l-1; i>=0; i--) {
                if(num[i]!=0) {
                    if(num[i]<9) {
                        ff=1;
                        rere=i;
                        break;
                    }
                }
                else{
                    f_f=i;
                }
            }
            if(ff) {
                if(f_f<rere){
                    num[rere]++;
                    for(i=0; i<=rere; i++) printf("%d",num[i]);
                    for(; i<l; i++) printf("0");
                }
                else{
                    if(f_f!=l-1){
                        num[f_f]=1;
                        for(i=0;i<=f_f;i++) printf("%d",num[i]);
                        for(;i<l;i++) printf("0");
                    }
                    else{
                        num[rere]++;
                    for(i=0; i<=rere; i++) printf("%d",num[i]);
                    for(; i<l; i++) printf("0");
                    }
                }
            }
            else {
                if(f_f==l-1) {
                    printf("1");
                    for(i=0; i<l; i++) printf("0");
                }
                else{
                    num[f_f]=1;
                    for(i=0;i<=f_f;i++) printf("%d",num[i]);
                    for(;i<l;i++) printf("0");
                }
            }
        }
        else if(flag>1) {
            int ff=0;
            for(i=l-1; i>=0; i--) {
                if(num[i]==0) {
                    num[i]++;
                    ff=1;
                    rere=i;
                    break;
                }
                if(num[i]!=0) {
                    if(num[i]<9) {
                        num[i]++;
                        ff=1;
                        rere=i;
                        break;
                    }
                }
            }
            if(ff) {
                for(i=0; i<=rere; i++) printf("%d",num[i]);
                for(; i<l; i++) printf("0");
            }
            else {
                printf("1");
                for(i=0; i<l; i++) printf("%d",num[i]);
            }
        }
        else {
            int j,fnow=0;
            for(i=l-1; i>=0; i--) {
                add(num[i]);
                for(j=num[i]+1;j<=9;j++){
                    if(fit(j)){
                        num[i]=j;
                        dd(j);
                        for(j=l-1;j>i;j--){
                            num[j]=f();
                        }
                        fnow=1;
                        break;
                    }
                }
                if(fnow) break;
            }
            if(fnow) {
                 for(i=0; i<l; i++) printf("%d",num[i]);
            }
            else {
                printf("1");
                for(i=0; i<l; i++) printf("%d",num[i]);
            }
        }
        printf("\n");
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值