hdu2964-Prime Bases

http://acm.hdu.edu.cn/showproblem.php?pid=2964

题意,给你一个整数n,现在要你分解成 n = k1 * ( 2 * 3 * ....*x1 ) + k2 * ( 2 * 3 * .... *x2 ) + ........;其中后面均为素数,且是由最小的2递增相乘;

分析:首先打印素数表;然后使用数组a【】来储存到从第一个素数2到第几个素数乘积。找到第i个小于n,第i +1个大于n的数值 i ;

然后分解n.使用数组b【】来储存a【i】的个数;同理执行多次,知道将n分解完毕;

如下的这种输出格式比较好,大家可以参考下;

参照做的;

 

#include<iostream>

#include<cstdio>

#include<cstring>

#include<cmath>

#include<algorithm>

#include<bitset>

#include<iomanip>



using namespace std;

const int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,39,41,43,47,51,53,57,59};  

__int64 a[21];  

int b[21],rem; 



void init( )

{

	a[ 0 ] = 1 ;

	for( int i =1 ; i < 21 ; ++i )

		a[ i ] = a[ i - 1 ] * prime[ i - 1 ] ;

}



void deal( int n )

{

	int i ;

	for( int i = 0 ; i < 21 ; ++i )

	{

		if( a[ i ] <= n && a[ i + 1 ] > n )

		{

			rem = i ;

			break ;

		}

	}

	memset( b , 0 ,sizeof( b ) ) ;

	for( int i = rem ; i >=0 ; --i )

	{

		b[ i ] = n / a[ i ] ;

		n %= a[ i ] ;

	}

}



void output( int n )

{

	cout << n << " = " ;

	for( int i = 0 ; i <= rem ; ++i )

	{

		

		if( b[ i ] )

		{

			cout << b[ i ] ;

			for( int j = 0 ; j < i ; ++j )

				cout << "*" << prime[ j ] ;

			if( i != rem )

				cout << " + " ;

		}

	}

	cout << endl ;

}



int main( )

{

	init( ) ;

	int n ;

	while( cin >> n , n )

	{

		deal( n ) ;

		output( n );

	}

	return 0 ;

}


 

 

你可能感兴趣的:(Prim)