整数分解成若干素数问题

Twinkleforever 2007-11-04 01:00:20
问题如下:

随便输入一个整数(n>1),将其分解为若干素数的乘积.
如:8=2*2*2,6=2*3
即8分解为2,2,2,
6分解为2,3


以上问题有没有比较好的方法来解决啊~想好久都不想不到比较好的办法~
高手指点一下~谢谢!
...全文
499 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
JackBurd 2012-03-29
  • 打赏
  • 举报
回复
#include<stdio.h>

void main()
{
int n;

printf("请输入要分解的数:");
scanf("%d", &n);
printf("%d = ", n);

for(int i = 2;n > 1; i++) //枚举因子
{
while(n%i == 0) //循环直至n不能被因子i整除
{
n /= i; //n累除因子得到下一个新的n值

if(n != 1) //n == 1说明分解完成
{
printf("%d * ", i);
}
else
{
printf("%d\n",i);
}
}
}
}
ckcz123 2012-03-29
  • 打赏
  • 举报
回复
楼主可以看看这个题: http://sznoi.cn/oj/ShowProblem?problemid=d062


这是我的答案:



/**********************************************************************************/
/* Problem: d062 "分解质因数" from */
/* Language: C++ */
/* Result: AC (31ms, 912KB) on SzNOI.cn */
/* Author: ckcz123 at 2012-02-27 10:11:00 */
/**********************************************************************************/

#include <iostream>

int main()
{
int e=2;
int r=2;
int t,u,s,w;
int prime[10000];
prime[1]=2;
while (e<=10000)
{
e++;
w=0;
for (t=1;t<r;t++)
{
if (e % prime[t] == 0)
w=1;
}

if (w == 0)
{
prime[r]=e;
r++;
}
}
r--;

int n;
std::cin >> n;

if (n<=2)
{
std::cout << "ERROR\n";
return 0;
}
int k=1;
int i=0;
int m=n;
int pi[50];
int ki[50];

while (n!=1 && k<=r)
{
if (n % prime[k] == 0)
{
i++;
int j=0;
while (n % prime[k] == 0)
{
n=n/prime[k];
j++;
}
pi[i]=prime[k];
ki[i]=j;
}
k++;
}
if (n!=1)
{
i++;
pi[i]=n;
ki[i]=1;
}

for (u=1;u<=i;u++)
{
for(s=1;s<=ki[u];s++)
{
std::cout << pi[u];
if (s!=ki[u])
std::cout << "*";
}
if (u!=i)
std::cout << "*";
else
std::cout << "\n";
}
return 0;
}



我承认生成质数表后再判断很麻烦。。
背包客的前奏 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

大概有这样的思路
1。获得整型数n
2。找到小于等于sqrt(n)的所有素数,组成数组array,得到长度m
3。i:0->m循环,如果n%array[i] == 0,输出array[i]
4。调整n = n/array[i]
5。如果n为array数组中值,输出n,结束算法
6。调整m值,循环3
[/Quote]

我觉得第三步 应该是弄m开始往前除波? 先算大的商嘛,,不知道想的对不?
laomai 2007-11-06
  • 打赏
  • 举报
回复
这个没什么好办法,我的思路是
1、先得到这个数以内的质数表,这个有很成熟的算法
2、将该数与每个素数比较,如果得到一个因子,则除掉这个因子,看新数是否为素数,如不是则继续从第一个素数开始比较,
到某一步得到一个不能再除的素数为止。
Twinkleforever 2007-11-05
  • 打赏
  • 举报
回复
谢谢楼上的朋友,请高手指教了~
huangxw000 2007-11-05
  • 打赏
  • 举报
回复
#include<stdio.h>
void main()
{
int a[100]={0},n,i,m,j=0;
printf("please input the number :n \n");
scanf("%d",&n);
m=n;
while(n>1)
{for(i=2;i<=n;i++)
if(n%i==0){a[j]=i;break;}
n=n/i;
j++;
}
printf( "%d=",m);
for(i=0;i<100;i++)
if(a[i]!=0)
printf( "%d*",a[i]);
printf("\n");
}
kekedou 2007-11-05
  • 打赏
  • 举报
回复
二楼的那位高手:
我觉得你的算法应该在获得整数n后判断一下这个n是否为质数。
oo_v_oo 2007-11-04
  • 打赏
  • 举报
回复
替LZ顶一顶,刀手可以练刀啊
oo_v_oo 2007-11-04
  • 打赏
  • 举报
回复
大概有这样的思路
1。获得整型数n
2。找到小于等于sqrt(n)的所有素数,组成数组array,得到长度m
3。i:0->m循环,如果n%array[i] == 0,输出array[i]
4。调整n = n/array[i]
5。如果n为array数组中值,输出n,结束算法
6。调整m值,循环3

33,322

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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