hdu 2964 Prime Bases (数学:算不上太水)

来源:互联网 发布:淘宝杰胜体育 编辑:程序博客网 时间:2024/05/21 09:23

感觉还是比较容易的,就是输出的时候可能比较恶心

有些人可能会想着生成一对素数,但其实没有必要

只要先写个小程序找到某个素数使得之前所有素数的乘积大于32为整型最大值即可

这样的话可知只需要这几个素数

解题的过程就是求a[i]的过程

a[i] = cur(n)%tmp[i+1]/tmp[i]

其中tmp[i]为前i个素数的乘积,cur(n)表示的是n把a[i]前面对应的项都减去的结果

就没有必要证明了吧,自己对着写一下就知道了

代码如下:

#include <stdio.h>int prime[15] = {1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29};int a[15], tmp[15];int main(void) {    int n, i, j, cnt, m;    while(scanf("%d", &n) != EOF && n) {        m = n;        a[0] = n % 2;        tmp[0] = 1;tmp[1] = 2;        for(i=1; ; ++i) {            tmp[i+1] = tmp[i] * prime[i+1];            n -= a[i-1] * tmp[i-1];            if(n <= 0) {                cnt = i;                break;            }            a[i] = n % tmp[i+1] / tmp[i];        }        printf("%d = ", m);        for(i=0; i<10; ++i) {            if(a[i]) {                printf("%d", a[i]);                for(j=1; j<=i; ++j) {                    printf("*%d", prime[j]);                }                if(i != cnt-1)                    printf(" + ");            }        }        printf("\n");    }    return 0;}


0 0
原创粉丝点击