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 ; }