杭电 “Prime Bases ”解题报告

Prime Bases

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 26   Accepted Submission(s) : 7
Font: Times New Roman | Verdana | Georgia
Font Size: ← →

Problem Description

Given any integer base b >= 2, it is well known that every positive integer n can be uniquely represented in base b. That is, we can write

n = a0 + a1*b + a2*b*b + a3*b*b*b + ...

where the coefficients a0, a1, a2, a3, ... are between 0 and b-1 (inclusive).

What is less well known is that if p0, p1, p2, ... are the first primes (starting from 2, 3, 5, ...), every positive integer n can be represented uniquely in the "mixed" bases as:

n = a0 + a1*p0 + a2*p0*p1 + a3*p0*p1*p2 + ...

where each coefficient ai is between 0 and pi-1 (inclusive). Notice that, for example, a3 is between 0 and p3-1, even though p3 may not be needed explicitly to represent the integer n.

Given a positive integer n, you are asked to write n in the representation above. Do not use more primes than it is needed to represent n, and omit all terms in which the coefficient is 0.

Input

Each line of input consists of a single positive 32-bit signed integer. The end of input is indicated by a line containing the integer 0.

Output

For each integer, print the integer, followed by a space, an equal sign, and a space, followed by the mixed base representation of the integer in the format shown below. The terms should be separated by a space, a plus sign, and a space. The output for each integer should appear on its own line.

Sample Input

123
456
123456
0

Sample Output

123 = 1 + 1*2 + 4*2*3*5
456 = 1*2*3 + 1*2*3*5 + 2*2*3*5*7
123456 = 1*2*3 + 6*2*3*5 + 4*2*3*5*7 + 1*2*3*5*7*11 + 4*2*3*5*7*11*13

Source

2008 Rocky Mountain Regional 


解题思路:
本题是简单的数论题,数据处理量也不大,不用担心超时的问题,用一个数组prime[]将29及以下的素数全存储起来,然后将素数累乘的积及最大系数+1(这里还没减去,在后面处理)放入一个二维数组sum中。
处理输入数据时,定义一个二维数组a,存放是否使用对应sum中该位置的值是否使用,未使用则继续,使用则减去该存放的值,在a【1】中第一个位置存放1,第二个位置存放系数。循环,在控制输出,就可以了。
本来素数到23就可以了,但是为什么要写到29,思考一下。可能不一定用到,但是我没算,细心的朋友算一下。

代码如下:
#include <iostream>
using namespace std;
int main()
{
	int n,i,j;//数据预处理
	int prime[]={2,3,5,7,11,13,17,19,23,29};
	__int64 sum[10][2],tempcount=1,tempnum=1;
	for(i=0,j=0;i<10;i++)
	{
		sum[i][0]=tempcount;
		sum[i][1]=tempnum;
		tempnum=prime[j]-1;
		tempcount*=prime[j++];
	}//数据处理
	while(cin>>n)
	{
		int out=n;
		if(n==0)break;
		int a[10][2]={0};
		i=9;
		while(n!=0)
		{
			if(n>=sum[i][0])
			{
				for(j=prime[i+1]-1;j>0;j--)
				{
					tempcount=j*sum[i][0];
					if(tempcount<=n)
					{
						a[i][0]=1;
						a[i][1]=j;
						n-=tempcount;
						break;
					}
				}
			}
			else
			{
				a[i][0]=0;
				a[i][1]=0;
			}
			i--;
		}//控制输出
		cout<<out<<" = ";
		int outcount=0;
		for(i=0;i<10;i++)
		{
			if(a[i][0]==1)
			{
				if(i==0)
				{
					cout<<"1";
					outcount++;
				}
				else
				{
					if(outcount!=0)
						cout<<" + ";
					cout<<a[i][1]<<"*";
					for(j=0;j<i;j++)
					{
						cout<<prime[j];
						if(j!=i-1)cout<<"*";
					}
					outcount++;
				}
			}
		}
		cout<<endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值