/**
* 输入一个整形数值,返回一个整形值
* @param n int整型 n>9
* @return int整型
*/
class Solution {
public:
int solution(int n) {
// 因为题目限制了输入参数n>9,所以不需要进行判断
int res = 0, base = 1;
for(int i = 9; i > 1; i--) {
while(n % i == 0) {
res += (i * base);
base *= 10;
n /= i;
}
}
return n > 1 ? -1 : res;
}
}; [编程题]数位之积
对于小于10的数n,输出1n。
对于大于10的数,需要分解为若干个个位数之积,数字的个数尽可能少。这个数字可以分解为以9,8,...,2的因子之积。然后从小到大输出即可。
我也写了第三题的答案,[编程题]vivo智能手机产能 只需两行 数学解法
class Solution {
public:
/**
* 输入一个整形数值,返回一个整形值
* @param n int整型 n>9
* @return int整型
*/
int solution(int n) {
// write code here
if (n < 10) return 10 + n;
int res = 0, base = 1;
for (int i = 9; i > 1; i--) {
while (n % i == 0) {
res += i * base;
base*=10;
n /= i;
}
}
if (n > 1) return -1;
else return res;
}
};
# 输入一个整形数值,返回一个整形值 (3783)# @param n int整型 n>9 # @return int整型 (3784)# 递归迭代 9-2 判断是否取余等于0,然后返回统计好的数 class Solution: def solution(self , n ): # write code here r = self.Func(n) if r>0: return r return -1 def Func(self,n): if n <10 : return n for i in range(9,1,-1): if n%i == 0 : return self.Func(n/i)*10+i; return -1
关键思想就是要从大到小遍历,因为要保证输出的位数越少越好,所以用越大的因子会用越少的位数除完,而相同的位数内,高位的数字越大,低位的就越小,倒序输出时的数就越小。 class Solution: def solution(self , n ): # write code here def search(n,temp): for i in range(9,1,-1): res = n/i if n%i==0: temp = temp*10+i if res==1: b= 0 while temp !=0: a = temp%10 b= b*10+a temp = temp//10 return b else: return search(res,temp) temp=0 return search(n,temp)
package com.pass;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Scanner;
public class Vivo2 {
static int num = 0;
static LinkedList numList = new LinkedList();
static boolean flag = true;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
num = scan.nextInt();
if(num > 0){
func(num);
output();
}else{
System.out.print("0");//表示输出零
}
}
private static void output() {
if(numList.size() == 0){
System.out.print("-1");//表示不存在
}else if(flag == false){
System.out.print("-1");//表示不存在
}else{
Collections.sort(numList);//列表或数组可以这样直接排序
String result = numList.toString();
for (int j = 0; j < numList.size(); j++) {
System.out.print(numList.get(j));
}
}
}
private static int func(int num2) {
if(num2 < 10){
addNum(num2);
return 0;
}else{
for (int i = 9; i > 1; i--) {//2,3,4,5,6,7,8,9
if((num2 % i) == 0){
addNum(i);
func(num2/i);
return 0;//提前终止
}
}
flag = false;//表示num2为大于10的素数,如11,13
return -1;//只是错误提示,这里没有作用
}
}
private static void addNum(int num2) {
numList.addLast(num2);
}
}
#评论里的大佬复刻版 class Solution: def solution(self,n): if n < 10: return 10 + n else: res,base = 0,1 for i in range(9,1,-1):#从9开始减,则个位肯定是最大的,后面逐渐递减,减到2(包括2) while(n % i == 0): res = res + i * base base = base *10 n = n / i if n > 1:# return -1 else: return res n = int(input()) s = Solution() print(s.solution(n))
class Solution: dig = [9, 8, 7, 6, 5, 4, 3, 2] n = 11 res = 0 out = [] su = False def f1(self, n): # global mul,su for i in self.dig: if n % i == 0: self.out.append(i) self.f1(n / i) return self.out if n > 9: self.su = True def solution(self, n): if n < 10: print(10 + n) else: outt = self.f1(n) if self.su: self.res = -1 else: for j in range(len(outt)): self.res =self.res+ 10 ** j * outt[j] return self.res
function solution( n ) {
// write code here
let ans='';
while(n!==1){
let flag = false;
for(let i=9; i>1; i--){
if(n%i===0){
ans = i+''+ans;
n/=i;
flag = true;
break;
}
}
if(!flag) return -1;
}
if(ans.length===0) return -1;
else return Number(ans);
} import java.util.*;
public class Solution {
public int solution (int n) {
int m = 0;
for(int i=9,j=0;i>1;i--){ // 数值从9开始,从大到小
if(n%i == 0){ // 找到其中一位商
n /= i;
m += (int)(i*Math.pow(10, j));
i++; // 有可能会有重复的数,继续判断
j++;
}
}
if(n == 1){
return m;
}else{
return -1;
}
}
} class Solution {
public:
/**
* 输入一个整形数值,返回一个整形值
* @param n int整型 n>9
* @return int整型
*/
int solution(int n) {
multiset<int,greater<int>> s;
for(int i = 9; i >= 2; i--){
while(n % i == 0){
s.emplace(i);
n /= i;
}
}
if(n != 1)
return -1;
int res = 0;
int tmp = 1;
for(int x : s){
res += x * tmp;
tmp *= 10;
}// write code here
return res;
}
}; import java.util.*;
public class Solution {
/**
* 输入一个整形数值,返回一个整形值
* @param n int整型 n>9
* @return int整型
*/
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.solution(108));
}
//为什么要用long呢 因为按照从大到小搜索会得到例如9988776621
//正确答案为1266778899,但是上面那个数已经大于integer表示范围了
long res=Long.MAX_VALUE;
long temp=0;
public int solution (int n) {
// write code here
dfs(n,1l,9);
//System.out.println(res);
if(res==Long.MAX_VALUE)return -1;
StringBuilder sb=new StringBuilder(Long.toString(res));
// System.out.println(sb.toString());
return Integer.parseInt(sb.reverse().toString());
}
private void dfs(int n,long sum,int index){
if(sum>=n){
if(sum==n&&res>temp){
res=temp;
}
return;
}
if(res!=Long.MAX_VALUE)return;
for(int i=index;i>=2;i--){
temp=temp*10+i;
dfs(n,sum*i,i);
temp=(temp-i)/10;
}
}
}
dfs 从9-->2搜索,reverse便是答案
function solution( n ) {
// write code here
var tmp = n;
var res = new Array();
for(let i=9;i>1;i--)
{
if(tmp%i == 0)
{
res.unshift(i);
tmp = tmp/i;
i = parseInt(res[res.length-1])+1;
}
}
if((n+'').length>res.length)
return -1;
else
return res.join('');
} * @param n int整型 n>9
* @return int整型
*/
function solution( n ) {
// write code here
let func=function(n){
if(n<10) return 10+n
let res=0,base=1
for(let i=9;i>1;i--){
while(n % i==0){
res+=i*base
base=base*10
n=n/i
}
}
if(n>1){
return -1
}else{
return res
}
}
var readline=require('readline')
const r1=readline.createInterface({
input:process.stdin,
output:process.stdout
})
r1.on('line',function(line){
var tokens=parseInt(line)
console.log(func(tokens))
})
}
module.exports = {
solution : solution
}; int solution(int n) {
int sum = 0;
int base = 1;
int tmp; //存储被除数
while (n > 1)
{
int flag = 0; //一个数不能被2-9除, 直接return -1;
for (int i = 9; i >= 2; i--)
{
if (n % i == 0) {
tmp = i;
sum = sum + base * tmp;
base *= 10;
flag = 1; //该数可以被整除
break;
}
}
if (flag == 0) return -1;
n = n / tmp;
}
return sum;
} n = int(input()) res = 0 base = 1 lis = [9,8,7,6,5,4,3,2] if n < 10: res = 10 + n else: for i in lis: while (n%i == 0): res += i*base base = base*10 n = n/i if n > 1: res = -1 print(res)
import java.util.*;
public class Solution {
/**
* 输入一个整形数值,返回一个整形值
* @param n int整型 n>9
* @return int整型
*/
public int solution (int n) {
// write code here
if(n<10)
return 10+n;
else{
int m=0,base=1;
while (n>9) {
int i;
for (i = 9; i > 1; i--) {
if (n % i == 0) {//能被整除
m=m+i*base;
base=base*10;
n=n/i;
break;
}
}
if(n>9&&i==1) //可能是一个不能被2-9整除的数 例如13
break;
}
if(n<=9){
m=m+n*base; //加上位数最高的那位
return m;
}else
return -1;
}
}
}