微创笔试题,求教好算法

peep99 2004-12-05 08:10:01
就是要求将任意输入的一个整数分解成质数相乘的形式输出:
例如:输入9 输出 9=3*3;输入12 输出 12=2*2*3

本人当时一时想不出好办法,用一个很笨的方法也不知道对不对
我首先求出该整数范围内的素数,例如12内的素数2,3,5,7,11从小到大放在一个数组prime中
然后用递归的方法依次判断该整数是否能被这些素数整除,如果可以就输出一个2,大致如下所示
analyze(int n) {
if(n==1) return(0);
for(int i=1;i<prime.length;i++) {
if(n mod prime[i]==0) {
print(prime[i]);
n/=prime[i];
if(n!=1) print("*") /打印*号
analyze(n);
}
}
不知道这种方法是不是可行,各位有没有更好的方法
...全文
1458 55 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
ensoniq 2005-06-27
  • 打赏
  • 举报
回复
zlf_jack(风云剑客) 正解。

BTW,
支持弱人工智能?强人工智能?
AntonlioX 2005-06-26
  • 打赏
  • 举报
回复
mark
hillMover 2005-06-24
  • 打赏
  • 举报
回复
mark!
sanhill 2005-06-23
  • 打赏
  • 举报
回复
我总结了一下,不知道总结的对不对。如果是合数就表示成素数相成,如果是素数就表示成素数和1相乘。结果保存在传进来的字符串里。
void func(int n,char* p)
{
int i = 2;int k = n;
char temp[10];
sprintf(p,"%d=",n);
while (n > 1)
{
if ((n & 1) && !(i & 1))
i = 3;
if (n % i == 0)
{
n = n / i;
sprintf(temp,"%d",i);
strcat(p,temp);
if (n != 1)
strcat(p,"*");
}
else
i += 2;
}
if (i == k)
strcat(p,"*1");
}

void main()
{
char s[256];
for(int i=2;i<200;i++)
{
func(i,s);
printf("%s\n",s);
}
}
lzhongsh 2005-06-20
  • 打赏
  • 举报
回复
mark
springzb 2005-06-20
  • 打赏
  • 举报
回复
szws(克米帅) 的比较简洁
tatbaby 2005-06-19
  • 打赏
  • 举报
回复
mark
hanweizhouricher 2005-05-25
  • 打赏
  • 举报
回复
mark
tuxw 2005-05-25
  • 打赏
  • 举报
回复
// 分解质因数
void PartPrime(unsigned n)
{
// 先将偶数因子全部取出
// 减少后面的循环次数
while((n & 1) == 0) {
printf("2*");
n >>= 1;
}

// 余下的只须判断奇数因子
unsigned i = 3;
while(n != 1) {
if(n % i == 0) {
printf("%d*", i);

// 取出这个奇数后
// 继续测试是否还包含当前的奇数因子
n /= i;
continue;
}
// 下一个奇数
i += 2;
}
printf("\b \b\n"); // 清除后面的 * 号
}
ZDL627 2005-05-24
  • 打赏
  • 举报
回复
看看这个简单不
#include<iostream.h>
void dis(int m)
{
cout<<endl<<m<<"=";
for(int i=2;i<=m;i++){
while(m%i==0){
m/=i;
cout<<i;
if(m!=1)cout<<"*";
}
}
}

void main()
{
int m;
cout<<"please enter a num ";
cin>>m;
dis(m);
}
hj5182001 2005-04-21
  • 打赏
  • 举报
回复
同意:aheadyes(素还真)的
Alonefield 2005-04-20
  • 打赏
  • 举报
回复
hehe,找一个128bit的数输进去,统统超时:)
尹立 2005-04-20
  • 打赏
  • 举报
回复
强烈支持aheadyes(素还真)的算法`
代码简便、也容易读、另外循环也比较简单~~
时间复杂度也是最小的~
值得提倡~~
yelling 2005-04-20
  • 打赏
  • 举报
回复
acm zju 1003
qhfu 2005-04-08
  • 打赏
  • 举报
回复
#include<iostream>
#include<queue>
using namespace std;
void find(int value,queue<int>& q)
{
int temp;
for(int i =2;i <= value;i++)
{
if((temp = value % i) == 0 )
{
q.push(i);
value = value/i;
find(value,q);
break;
}
}
}
int main()
{
queue<int> q;
int i;
cout<<"enter a value: ";
cin>>i;
find(i,q);
cout<<i<<"=";
while(!q.empty())
{
cout<<q.front();
q.pop();
if(!q.empty())
cout<<"*";
}
system("PAUSE");
}
mmmcd 2005-04-08
  • 打赏
  • 举报
回复
全都是同一个思路的。

有没有谁试过拉斯维加斯算法分解质因数?
Hannibal005 2005-04-08
  • 打赏
  • 举报
回复
szws(克米帅) 的程序不错,佩服佩服,就是为素数时显示素数本身最好为1*素数本身
wasltone 2005-04-07
  • 打赏
  • 举报
回复
楼上的程序不错。。
比较简便,Code也比较简便
szws 2005-04-07
  • 打赏
  • 举报
回复
#include "iostream.h"
void f(int n)
{
for (int i=2; i * i <= n; i++)
{
while (!(n % i))
{
if(n!=i)
{
cout << i << "*";
n /= i;
}
else
break;
}
}

cout << n;
}
void main()
{
int a=100;
f(a);
}
Hannibal005 2005-04-07
  • 打赏
  • 举报
回复
import java.util.*;
public class Test {
public static void main(String[] arg) {
Test com = new Test();
int index = Integer.parseInt(arg[0]);
Vector numbers = new Vector();
for (int i=1;i<=index;i++) {
if (com.isNumber(i)) {
numbers.add(i);
}
}
int size = numbers.size();
int[] ss = new int[size];
for (int j=0;j<size;j++) {
ss[j] = (Integer)numbers.elementAt(j);
}
com.show(index,ss);
}
public boolean isNumber(int i) {
for (int k = 2;k<i;k++) {
if (i%k == 0) {
return false;
}
}
return true;
}
public void show(int i,int[] ss) {
System.out.println("input: "+i);
System.out.print("output:");
//for (int j = 0;j<ss.length;j++) {
// System.out.println(ss[j]);
//}
Vector result = new Vector();
for (int k=0;k<ss.length;k++) {
if (i%ss[k] == 0) {
result.add(ss[k]);
}
}
int sizes = result.size();
int[] aa = new int[sizes];
//System.out.println(sizes);
StringBuffer out = new StringBuffer();
out.append(i);
out.append("=");
int sure = 1;
for (int j=0;j<sizes;j++) {
out.append(((Integer)result.elementAt(j)));
aa[j] = (Integer)result.elementAt(j);
sure = sure*aa[j];
if (j<sizes -1) {
out.append("*");
}
}
if (i ==1) {
out.append("*");
out.append("1");
} else
if (sure < i) {
int ant = i/sure;
while (ant != 1) {
for (int x=1;x<sizes;x++) {
if (ant%aa[x] == 0) {
out.append("*");
out.append(aa[x]);
ant = ant/aa[x];
}
}
//ant = sure*aa[2];
}
}

System.out.println(out);
}
}
加载更多回复(35)

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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