您的位置:首页 > 其它

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

2014-07-13 18:15 471 查看
感觉还是比较容易的,就是输出的时候可能比较恶心

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

只要先写个小程序找到某个素数使得之前所有素数的乘积大于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: