分解素因子问题

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;
}

结果是超时的,问 有没有什么更高效的算法思路。欢迎给意见。谢谢!!!
...全文
803 11 打赏 收藏 转发到动态 举报
写回复
用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
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 定义:因子分解是将一个正整数表示为若干个数相乘的形式,例如,18可以表示为2×3 2 。 算法:代码通过递归方式实现因子分解。程序先读取用户输入的正整数,然后利用search()递归函数找出这些数的因子,并以指数形式输出结果。 变量声明:在main()函数中,声明了整型变量N用于接收输入数字,同时声明了大小为100的整型数组a[],用于存储因子及其指数。 循环:通过for循环遍历数组a[],清零数组元并打印因子分解结果。 功能:search()用于寻找输入数字remainder的因子,并递归分解其余数。 参数: remainder:当前待分解的数值。 nTerm:当前分解出的因子的索引位置。 a[]:存储因子及其指数的数组。 实现细节: 局部变量j初始化为2(最小的数)。如果nTerm不为0,则从上一次找到的因子开始查找。 循环遍历,直到找到因子或确定remainder本身是数。 找到因子后,将其存入数组a[],并递归调用search()处理新的余数remainder/j。 如果未找到新的因子,说明remainder是数,直接存入数组a[]。 在main()函数中,通过for循环遍历数组a[],以指数形式输出因子分解结果。对于每个因子a[i]: 如果当前因子与前一个相同,则增加指数expon。 如果不同,则先输出前一个因子及其指数,再输出当前因子。 遇到数组元a[i]为0时,表示所有因子已输出完毕,跳出循环。 在search()函数的循环条件中,“i < 100”不能改为“a[i] != 0”,因为后者可能导致数组下标越界或无限循环,数组长度固定为100。 递归出口的正确设置至关重要。在本例中,找到因子后递归调用继续分解新余数,直到余数

65,206

社区成员

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

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