Codeforces Round #292 (Div. 2) C. Drazil and Factorial(贪心YY)

12 篇文章 0 订阅

题目链接:http://codeforces.com/contest/515/problem/C

题意:定义了f(a)是正整数a中每一位数字的阶乘之和,求没有1,0数字且最大的b使得f(b)=f(a)

思路:可以用数组记录f(a)有哪些因数,而且让b最大,所以可以把非素数的因数分成素数因数,然后从高位到低位输出,有些细节还是要注意。

//Accepted 31 ms	 4 KB	
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define  ll long long 
using namespace std;
int cnt[11]; //记录每个因数有多少个 
int date[11]; //取出一个数字的阶乘后,更新cnt 
void dateup() //更新cnt  
{
    date[2]+=date[4]*2;
    date[2]+=date[6];
    date[3]+=date[6];
    date[2]+=date[8]*3;
    date[3]+=2*date[9];
    cnt[2]-=date[2];
    cnt[3]-=date[3];
    cnt[7]-=date[7];
    cnt[5]-=date[5];
    memset(date,0,sizeof(date));
}
int main()
{
    ll n,m;
    scanf("%I64d",&n);
    scanf("%I64d",&m); //其实用字符串即可,反正只有15位用longlong也可 
    while(m){
        int num=m%10;
		for(int i=2;i<=num;i++)
            cnt[i]++;
		m/=10;
        
    }
    cnt[2]+=cnt[4]*2;
    cnt[2]+=cnt[6];
    cnt[3]+=cnt[6];
    cnt[2]+=cnt[8]*3;
    cnt[3]+=2*cnt[9];
    while(cnt[7]--){
        printf("7");
        for(int i=2;i<7;i++) date[i]++;
    }
    dateup();
    while(cnt[5]--){
        printf("5");
        for(int i=2;i<5;i++) date[i]++; 
    }
    dateup();
    while(cnt[3]--){
        printf("3");
        for(int i=2;i<3;i++) date[i]++;
    }
    dateup();
    while(cnt[2]--){
        printf("2");
    }
    puts("");
    return 0;
}
上面是中规中矩的写法,也可优化一下,不过可读性下降了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int main() {
	int n, num[11];
	char a[20];
	while(scanf("%d %s", &n, a) != EOF) {
		memset(num, 0, sizeof(num));
		for(int i = 0; i < n; i++) {
			if(a[i] != '0' || a[i] != '1') {
				if(a[i] == '6') {
					num[5]++; 
					num[3]++;
				} 
				else if(a[i] == '8') {
					num[2] += 3;
					num[7] ++;
				}
				else if(a[i] == '4') {
					num[2] += 2;
					num[3]++;
				}
				else if(a[i] == '9') {
					num[7]++;
					num[2]++;
					num[3]+=2;
				}
				else num[a[i] - '0']++;
			}
		}
		
		for(int i = 9; i >= 2; i--) {
			while(num[i]){
				printf("%d", i);
				num[i]--;
			}
		}
		printf("\n");
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值