/** * 输入一个整形数值,返回一个整形值 * @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; } };
关键思想就是要从大到小遍历,因为要保证输出的位数越少越好,所以用越大的因子会用越少的位数除完,而相同的位数内,高位的数字越大,低位的就越小,倒序输出时的数就越小。 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)
[编程题]数位之积
对于小于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
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; } } }