【oj每周推荐】(算法)各位乘积

我姓区不姓区 2009-06-16 10:27:25
加精
给出整数N(0 ≤ N ≤ 10^9),找出一个最小的整数Q,使得将Q的每一位相乘之后等于N
例如N=18,则Q可能取值为:29(2×9=18),36(3×6=18),63(6×3=18),92(9×2=18)
那么我们只要取最小值29即为结果
输入:整数N(0 ≤ N ≤ 10^9)
输出:如果存在这样的Q,则输出Q,如果不存在,输出-1
...全文
305 218 打赏 收藏 转发到动态 举报
写回复
用AI写文章
218 条回复
切换为时间正序
请发表友善的回复…
发表回复
x642458 2010-09-17
  • 打赏
  • 举报
回复
Flashboy2005 2010-06-28
  • 打赏
  • 举报
回复
1. 分解因式,找到所有质数. 都是10以内pass, 否则不存在 (/2 , /3, /5, /7)
2. 从大到小排列所有质数,优先选择较大的相乘且结果仍为个位数.将乘数清0.依次排列最大数.可得.(3*3,2*3, 2*2)

int algorithm(int num)
{
int a[]= new int[9]();
int re = 0;

//inital 0
///2 , /3, /5, /7
int div[] = int div[]{2,3,5,7};
for(int i =0; i<div.length; i++)
{
while(num%div[i]=0)
{
a[div[i]]+=1;
}
}

//calculate the min length. 3*3, 2*3, 2*2

a[9] = a[3]/2;
a[3] = a[3]%2;

if(a[3]>a[2])
{
a[6] = a[2];
a[3] -= a[2];
a[2] = 0;
}
else
{
a[6] = a[3];
a[2] -= a[3];
a[3] = 0;
}


for(int i=0; i<=9; i++)
{
for(int j = a[i];j>0;j--)
{
if(a[i] != 0)
{
re=re *10 + i;
}
}
}

return re;
}
我姓区不姓区 2009-06-22
  • 打赏
  • 举报
回复
非常感谢大家的参与,由于回复人数较多,分数较少,所以不能为每位给出思路或代码的兄弟分,还望见谅,最重要的是能够让大家交流各自的见解
我的思路与绝大多数人相同的,我就不贴自己的代码了,再次感谢大家的参与
tdtxflsh 2009-06-22
  • 打赏
  • 举报
回复
学习了
yaoting123456789_ 2009-06-22
  • 打赏
  • 举报
回复
学习中
wangwang1103 2009-06-22
  • 打赏
  • 举报
回复
Mark.
yan286093636 2009-06-21
  • 打赏
  • 举报
回复
看到算法就头晕,哎,要克服了..............
www8388 2009-06-21
  • 打赏
  • 举报
回复


public long getQ(long N) {
ArrayList<Integer> list = new ArrayList<Integer>();
long Q = 0;
if (N > 1) {
factorization(N, list);
Collections.sort(list);
for (int index = 0; index < list.size(); index++) {
Q = Q * 10 + list.get(index).intValue();
}
} else {
Q = -1;
}
return Q;
}

private void factorization(long N, ArrayList<Integer> list) {
int factor;
for (factor = 9; factor > 1; factor--) {
if (N % factor == 0) {
list.add(new Integer(factor));
factorization(N / factor, list);
break;
}
}
if (N > 1 && factor <= 1) {
list.clear();
list.add(new Integer(-1));
}
}
phf0313 2009-06-21
  • 打赏
  • 举报
回复
寒一个。
Hemingway718 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dupeng0811 的回复:]
快乐接分
shibenjie 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 203 楼 www8388 的回复:]
Java code

public static long getMinNumber(long N) {
long Q = 0;
long temp = N;
double x = 0;
int index = 9;
while (true) {
for (index = 9; index >1; index--) {
if (temp % index == 0)
break;
}
if (index <= 1) {
return -1;
} else {
Q = (lo…
[/Quote]
传参为0时为返回9

借203 楼的算法:
while前加上个判断:
if(N==0)
return -1;

dnsRRR 2009-06-21
  • 打赏
  • 举报
回复
因式分解到<10的个位数,不能分解到个位数的返回-1

207楼的函数很有趣
javaei 2009-06-20
  • 打赏
  • 举报
回复
我想知道的是这个算法的实际意义什么,希望楼主能给出应用这个算法的实际问题
yqhzmzybdyy 2009-06-20
  • 打赏
  • 举报
回复
要达到楼主要求不难。但是要写出高效率的程序却很难啊/
dnsRRR 2009-06-20
  • 打赏
  • 举报
回复
统计所有因子位数的和,个数最小的一组,按从小到大排序,组成答案
dnsRRR 2009-06-20
  • 打赏
  • 举报
回复
更正:
统计所有因子位数的和,按从小到大排序,组成答案
dnsRRR 2009-06-20
  • 打赏
  • 举报
回复
伪代码:
因式分解,统计因子个数,个数最小的一组,按从小到大排序,组成答案

www8388 2009-06-20
  • 打赏
  • 举报
回复

public static long getMinNumber(long N) {
long Q = 0;
long temp = N;
double x = 0;
int index = 9;
while (true) {
for (index = 9; index >1; index--) {
if (temp % index == 0)
break;
}
if (index <= 1) {
return -1;
} else {
Q = (long) (Q + index * Math.pow(10, x));
temp = temp / index;
x++;
if (temp <= 1)
return Q;
}
}
}


gmajygah 2009-06-20
  • 打赏
  • 举报
回复
学习....
huizishuibei 2009-06-20
  • 打赏
  • 举报
回复
来学习
加载更多回复(195)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧