• 九度OJ 1104:整除问题 (整除、因式分解)


    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:4142

    解决:1346

    题目描述:

    给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

    输入:

    两个整数n(2<=n<=1000),a(2<=a<=1000)

    输出:

    一个整数.

    样例输入:
    6 10
    样例输出:
    1
    来源:
    2011年上海交通大学计算机研究生机试真题

    思路:

    对a进行因式分解,记录素因子以及个数。计算n!过程中,累加记录的相关素因子个数,直到所有的素因子个数都超过a的素因子个数乘(k+1),这时的n减去1就是答案。

    但该题如果给定输入数据不当,可能会存在bug,即对所有的k,都同时满足或同时不满足被a^k整除和被a^(k+1)整除。


    代码:

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
     
    #define N 1000 
         
    int p[N+1], cp;
         
    typedef struct node {
        int num;
        int count;
        int acount;
    } PP;
     
    PP pa[N+1];
    int cpa;
         
    int isprime(int x) 
    {           
        for (int i=2; i<=sqrt(x); i++)
        {
            if (x%i == 0)
                return 0;
        }
        return 1;
    }   
         
    void getPrimes(int x)
    {   
        int i = 1;
        cpa = 0;
        while (x != 1)
        {       
            if (x % p[i] == 0)
            {   
                cpa ++;
                pa[cpa].num = p[i];
                pa[cpa].count = 0;
                while (x % p[i] == 0)
                {
                    pa[cpa].count ++;
                    x /= p[i];
                }
            }
            i ++;
        }
    }
     
    int main(void)
    {
        int n, a, k, i, j, r;
     
        cp = 0;
        for (i=2; i<=N; i++)
        {
            if (isprime(i))
                p[++cp] = i;
        }
     
        //for (i=1; i<=cp; i++)
        //  printf("%d ", p[i]);
        //printf("
    ");
     
        while (scanf("%d%d", &n, &a) != EOF)
        {
            getPrimes(a);
            for (r=1; r<=cpa; r++)
                pa[r].acount = 0;
            for(i=2; i<=n; i++)
            {
                j = i;
                r = 1;
                while (j != 1)
                {
                    if (r > cpa)
                        break;
                    while (j%(pa[r].num) == 0)
                    {
                        pa[r].acount ++;
                        j /= (pa[r].num);
                    }
                    r ++;
                }
            }
            k = pa[1].acount/pa[1].count;
            for (r=2; r<=cpa; r++)
            {
                int kk = pa[r].acount/pa[r].count;
                if (kk < k)
                    k = kk;
            }
            printf("%d
    ", k);
            //for (r=1; r<=cpa; r++)
            //  printf("%d %d %d
    ", pa[r].num, pa[r].count, pa[r].acount);
        }
         
        return 0;
    }       
    /**************************************************************
        Problem: 1104
        User: liangrx06
        Language: C
        Result: Accepted
        Time:10 ms
        Memory:944 kb
    ****************************************************************/


    编程算法爱好者。
  • 相关阅读:
    LINUX-----管道流及重定向
    转:vim----复制粘贴
    linux ----虚拟机无法与本地机通信
    C语言---注释
    C语言---翻译过程
    DROP--删除表
    ALTER---删除字段
    Oracle中用一条Sql实现任意的行转列拼接 多行拼接
    Oracle列操作(增加列,修改列,删除列)
    Java 把long 转换成 日期 再转换成String类型
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5083928.html
Copyright © 2020-2023  润新知