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


 

 

转载于:https://www.cnblogs.com/dyllove98/p/3206309.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值