uva 993 Product of digits (分解因子)

uva 993 Product of digits

题目大意:给定一个数N,要求出一个数,使得这个数的每一位相乘会等于N,且这个数的值最小。

解题思路:简单的分解因子。要注意的地方有两点:1) 因子从9开始向2遍历,可以保证位数最小; 2)当N等于1是最好特殊处理。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int n, dig[100000];
int main() {
	int T;
	scanf("%d", &T);
	while (T--) {
		scanf("%d", &n);
		int flag = 0, cnt = 9, cnt2 = 0;
		if (n == 1) {
			printf("1\n");
			continue;
		}
		while (n != 1) {
			if (cnt == 2 && n % cnt != 0) {
				flag = 0;
				break;
			}

			if (n % cnt != 0) {
				cnt--;
			}
			else {
				flag = 1;
				n /= cnt;
				dig[cnt2++] = cnt;
				cnt = 9;
			}
		}
		if (!flag)	 printf("-1\n");
		else {
			for (int i = cnt2 - 1; i >= 0; i--) {
				printf("%d", dig[i]);
			}
			printf("\n");
		}
	}
	return 0;
}
时间: 2024-12-20 22:01:09

uva 993 Product of digits (分解因子)的相关文章

UVa 993 - Product of digits

题目:给你一个整数n,求一个数m,使得m的每个位数的乘积是n,求最小的m. 分析:贪心.直接从9到2枚举所有的因数,统计即可.如果还有大于9的素数这输出-1. 说明:今天Timus发邮件,说我的这个题目,在那边的解错了╮(╯▽╰)╭. #include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int save[10]; int main() { int n,m,now; w

UVA - 993 - Product of digits (简单贪心)

993 Product of digits For a given non-negative integer number N, ?nd the minimal natural Q such that the product of all digits of Q is equal N. Input The ?rst line of input contains one positive integer number, which is the number of data sets. Each

993 - Product of digits

题目:993 - Product of digits 题目大意:将一个数通过因式分解变成另一个由因子组成的最小的数. 解题思路:因为要组成数,所以因子只需要从 2 - 9,又因为需要最小的数,所以因式分解从最大的因子开始,这样位数最少,最后输出从最小的因子输出,保证最小.1的话需要特判,因为所有的数都有因子1. 代码: #include <stdio.h> #include <string.h> const int N = 10; int c[N]; int n; bool fac

UVa 11330 (置换 循环的分解) Andy&#39;s Shoes

和UVa11077的分析很类似. 我们固定左脚的鞋子不动,然后将右脚的鞋子看做一个置换分解. 对于一个长度为l的循环节,要交换到正确位置至少要交换l-1次. 1 #include <cstdio> 2 #include <cstring> 3 #include <map> 4 using namespace std; 5 6 bool vis[10000 + 10]; 7 8 int main() 9 { 10 //freopen("in.txt",

UVA 1016 - Silly Sort(置换分解+贪心)

UVA 1016 - Silly Sort 题目链接 题意:给定一个序列,数字都不同,每次可以交换两个数字,交换的代价为两数之和,要求出把这个序列变成递增最小代价 思路:利用置换的分解原理,可以把序列的每条循环单独考虑,对于每条循环而言,不断交换肯定每个数字至少会换到一次,再利用贪心的思想,如果每次拿循环中的最小值去置换,那么就是这个最小值会用长度-1次,而剩下的数字各一次,注意这里还有一种可能优的方法,就是先把整个序列中的最小值换到该循环中,等置换完再换出去,两种都考虑进来即可 代码: #in

URAL 1014 Product Of Digits

注意特判 0 1 分解因子 从9到2 1 import java.util.Scanner; 2 3 public class P1014 4 { 5 public static void main(String args[]) 6 { 7 try (Scanner cin = new Scanner(System.in)) 8 { 9 while (cin.hasNext()) 10 { 11 int n = cin.nextInt(); 12 StringBuilder builder =

UVA 10106 Product (大数相乘)

Product The Problem The problem is to multiply two integers X, Y. (0<=X,Y<10250) The Input The input will consist of a set of pairs of lines. Each line in pair contains one multiplyer. The Output For each input pair of lines the output line should c

Codeforces 757B:Bash&#39;s Big Day(分解因子+Hash)

http://codeforces.com/problemset/problem/757/B 题意:给出n个数,求一个最大的集合并且这个集合中的元素gcd的结果不等于1. 思路:一开始把素数表打出来,发现有9k+个数,不能暴力枚举.发现O(sqrt(n)*n)似乎可行,就枚举因子,然后出现过的因子就在Hash[]加1,最后枚举素数表里的元素,找出现次数最多的,因为那些数都可以映射在素数表里面.注意最少的ans是1. 1 #include <cstdio> 2 #include <algo

UVA - 10892 LCM Cardinality (枚举因子)

A pair of numbers has a unique LCM but a single number can be the LCM of more than one possible pairs. Forexample 12 is the LCM of (1, 12), (2, 12), (3,4) etc. For a given positive integer N, the number of different integer pairs withLCM is equal to