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

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

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

只要先写个小程序找到某个素数使得之前所有素数的乘积大于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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值