分解素因子问题

RiweiChen 2011-04-08 12:49:03
Problem Description
假设x是一个正整数,它的值不超过65535(即1<x<=65535),请编写一个程序,将x分解为若干个素数的乘积。
Input
输入的第一行含一个正整数k (1<=k<=10),表示测试例的个数,后面紧接着k行,每行对应一个测试例,包含一个正整数x。
Output
每个测试例对应一行输出,输出x的素数乘积表示式,式中的素数从小到大排列,两个素数之间用“*”表示乘法。

以下是我的代码:
#include<iostream>
using namespace std;
int is_primer(int n)
{
for (int i=2;i<n;i++)
{
if (n%i==0)
{
return 0;
}
}
return 1;
}
int main()
{
int k,x=0;
int temp=2;
int prime[35];
int power[35]={0};
while(x<35)
{
if(is_primer(temp++))
{
prime[x]=temp-1;
x++;
}

}
int temp2=0;
cin>>k;
for (int i=0;i<k;i++)
{
cin>>x;
temp2=0;
for (int z=0;z<35;z++)
{
power[z]=0;
}
while (x>=prime[temp2])
{
while(x%prime[temp2]==0)
{
x=x/prime[temp2];
power[temp2]++;

}
temp2++;


}
power[temp2]++;
//输出结果;
int test=0;
for (int p=0;p<temp2;p++)
{
for (int pow=0;pow<power[p];pow++)
{
if(test==0)
{
cout<<prime[p];
test=1;
}
else
cout<<'*'<<prime[p];
}
}
cout<<endl;
}

return 0;
}

结果是超时的,问 有没有什么更高效的算法思路。欢迎给意见。谢谢!!!
...全文
798 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
RiweiChen 2011-04-08
  • 打赏
  • 举报
回复
谢谢楼上各位的帮助,谢谢呐。。。。
RiweiChen 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ulfsaar 的回复:]
引用 7 楼 chenriwei2 的回复:
回一楼:
wA指的是没有考虑0和1是吧?


你那个不是因为算法效率而超时的,而是因为处理较大的数时出问题了,出现了死循环超时的
其实就是WA
[/Quote]
谢谢您,现在我才发现一个严重的错误,我一直以为素数的个数是很少的,用几十个去表示就应该足够了,今儿特地去查了下素数表,我的天啊,7万以内的素数有差不多6900多个,一看还真吓一跳。我竟然想用区区的35个数来表示所有的素数。。。
Ulfsaar 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chenriwei2 的回复:]
回一楼:
wA指的是没有考虑0和1是吧?
[/Quote]

你那个不是因为算法效率而超时的,而是因为处理较大的数时出问题了,出现了死循环超时的
其实就是WA
qq120848369 2011-04-08
  • 打赏
  • 举报
回复
很明显应该用筛法求素数的过程中求素因子.
RiweiChen 2011-04-08
  • 打赏
  • 举报
回复
回一楼:
wA指的是没有考虑0和1是吧?
Ulfsaar 2011-04-08
  • 打赏
  • 举报
回复
修改过的程序,你可以试下

#include<iostream>
#include <math.h>
using namespace std;
#define PRIMENUM 6550
int prime[PRIMENUM];
int x=0;
int is_primer(int n)
{
for (int i=0; i<x; ++i)
{
if (n%prime[i]==0)
{
return 0;
}
}

return 1;
}

int main()
{
int k;
int temp=2;
while(x<PRIMENUM)
{
if(is_primer(temp++))
{
prime[x]=temp-1;
++x;
}
}

int temp2=0;
cin>>k;
for (int i=0;i<k;i++)
{
cin>>x;
temp2=0;
bool bFirst = true;
while (x >= prime[temp2])
{
while(x%prime[temp2]==0)
{
x=x/prime[temp2];
if (bFirst)
{
bFirst = false;
}
else
{
cout<<'*';
}

cout<<prime[temp2];
}
++temp2;
}
cout<<endl;
}

return 0;
}
showjim 2011-04-08
  • 打赏
  • 举报
回复
如果查询次数多的话,可以先用素数筛法算出每一个数的最小素数因子,然后查询就直接除商跳转
Ulfsaar 2011-04-08
  • 打赏
  • 举报
回复
你这超时跟程序本身效率关系不大,你可以试下65534这样的数,你就知道了
Ulfsaar 2011-04-08
  • 打赏
  • 举报
回复
x是一个正整数,它的值不超过65535(即1<x<=65535)
应该算出65535以内的素数
不需要将因子保存再输出,直接输出就可以了,只用注意下乘号(*)的处理
qq675927952 2011-04-08
  • 打赏
  • 举报
回复
首先你这个prime表可以事先算好,如prime[36]={2,3,5,7,11,....},就用你之前的is_primer(int n)(其实算素数还有更好的算法,你这个算法的效率比较低)这个算法算就行,这样你程序就省了算这个表的时间了,只要程序事先把这个表定义好了就行。。。,这样就应该不会超时了。。。
Ulfsaar 2011-04-08
  • 打赏
  • 举报
回复
你这程序不超时也会WA

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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