• UVA 993 Product of digits


    UVA_993

    首先我们考虑,什么情况下会是-1?显然是当x不能分解成10以内素数乘积的时候,那么我们直接把x分解素数然后依次输出就可以了吗?也不行。

    至于为什么不行,我们不妨想一下怎么保证最后的数最小。首先,要数最小,肯定是先输出小的数字再输出大的,其次,我们也要保证数字的个数尽可能少,而且我们要优先去保证这一点。

    想到这里,我们不妨看一下10以内的数:23456789,其中8可以兼并32,于是我们先要看x包含几个8,其次,469都能兼并两个数,而且他们最大能兼并的数字之和是一定的,不会因兼并策略的改变而改变,但是为了保证小的数字更多,我们便要先考虑4,再考虑6,最后考虑9。剩下的2357再依次看一下就可以了。

    #include<stdio.h>
    int a[10];
    int judge(int x)
    {
    int i;
    memset(a,0,sizeof(a));
    while(x%8==0)
    {
    a[8]++;
    x/=8;
    }
    while(x%4==0)
    {
    a[4]++;
    x/=4;
    }
    while(x%6==0)
    {
    a[6]++;
    x/=6;
    }
    while(x%9==0)
    {
    a[9]++;
    x/=9;
    }
    for(i=2;i<8;i++)
    {
    while(x%i==0)
    {
    a[i]++;
    x/=i;
    }
    }
    if(x!=1)
    return 0;
    else
    return 1;
    }
    int main()
    {
    int i,j,k,Q,t;
    scanf("%d",&t);
    while(t--)
    {
    scanf("%d",&Q);
    if(Q==0)
    printf("0\n");
    else if(Q==1)
    printf("1\n");
    else if(judge(Q))
    {
    for(i=2;i<10;i++)
    while(a[i])
    {
    printf("%d",i);
    a[i]--;
    }
    printf("\n");
    }
    else
    printf("-1\n");
    }
    return 0;
    }


  • 相关阅读:
    56.字符流中第一个不重复的数
    55.表示数值的字符串
    54.正则表达式匹配
    53.构建乘积数组
    52.数组中重复的数字
    51.把字符串转化为整数
    50.不用加减乘除求和
    49.求1+2+3+.......+n
    The great pleasure in life is doing what people say you cannot do.
    mkcert本地 HTTPS 加密证书生成工具
  • 原文地址:https://www.cnblogs.com/staginner/p/2193004.html
Copyright © 2020-2023  润新知