黑马程序员技术交流社区
标题:
怎么将一个正整数分解质因数
[打印本页]
作者:
张龙跃
时间:
2013-5-16 20:56
标题:
怎么将一个正整数分解质因数
本帖最后由 张龙跃 于 2013-5-16 20:59 编辑
将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n <>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
import java.util.Scanner;
public class Hello {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入一个正整数");
int a =input.nextInt();
}
}
求思路
作者:
曾大鹏
时间:
2013-5-16 21:18
这题目以前搞acm写过,,发个c写的代码
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 40000
struct node
{
int x,y;
}s[40000];
int a[MAX];
void prime()
{
int i,j;
memset(a,0,sizeof(a));
for(i=2;i<=MAX;i++)
{
if(a[i]==0)
{
for(j=2;j*i<=32000;j++)
a[i*j]=1;//不是素数标记为1
}
}
}
int main()
{
int n,i,j,k,num;
prime();
while(scanf("%d",&n)!=EOF)
{
k=sqrt(n);num=0;
if(n==1)
{
printf("1 = 1\n");
continue;
}
printf("%d = ",n);
for(i=2;i<=k;i++)
{
if(n%i==0&&a[i]==0)
{
j=1;
while(1)
{
n=n/i;
if(n%i)
break;
j++;
}
s[num].x=i;
s[num++].y=j;
k=sqrt(n);
}
}
if(n!=1)
{
s[num].x=n;
s[num++].y=1;
}
for(i=0;i<num;i++)
{
if(i==0)
{
if(s[i].y==1)
printf("%d",s[i].x);
else
printf("%d^%d",s[i].x,s[i].y);
}
else
{
if(s[i].y==1)
printf(" * %d",s[i].x);
else
printf(" * %d^%d",s[i].x,s[i].y);
}
}
printf("\n");
}
return 0;
}
复制代码
作者:
曾大鹏
时间:
2013-5-16 21:18
这题目以前搞acm写过,,发个c写的代码
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 40000
struct node
{
int x,y;
}s[40000];
int a[MAX];
void prime()
{
int i,j;
memset(a,0,sizeof(a));
for(i=2;i<=MAX;i++)
{
if(a[i]==0)
{
for(j=2;j*i<=32000;j++)
a[i*j]=1;//不是素数标记为1
}
}
}
int main()
{
int n,i,j,k,num;
prime();
while(scanf("%d",&n)!=EOF)
{
k=sqrt(n);num=0;
if(n==1)
{
printf("1 = 1\n");
continue;
}
printf("%d = ",n);
for(i=2;i<=k;i++)
{
if(n%i==0&&a[i]==0)
{
j=1;
while(1)
{
n=n/i;
if(n%i)
break;
j++;
}
s[num].x=i;
s[num++].y=j;
k=sqrt(n);
}
}
if(n!=1)
{
s[num].x=n;
s[num++].y=1;
}
for(i=0;i<num;i++)
{
if(i==0)
{
if(s[i].y==1)
printf("%d",s[i].x);
else
printf("%d^%d",s[i].x,s[i].y);
}
else
{
if(s[i].y==1)
printf(" * %d",s[i].x);
else
printf(" * %d^%d",s[i].x,s[i].y);
}
}
printf("\n");
}
return 0;
}
复制代码
作者:
萌小子
时间:
2013-5-16 22:02
import java.util.Scanner;
public class QiuYinShu {
/**
* 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
* 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
* (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
* (2)如果n <>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。
* (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
* @param args
*/
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println("请输入一个正整数");
int num=s.nextInt();
int k = 2;
System.out.print(num + "=");
while (num > k) {
if (num % k == 0) {
System.out.print(k + "*");
num = num / k;
}
if (num % k != 0) {
k++;
}
}
System.out.println(k);
}
}
复制代码
作者:
Sword
时间:
2013-5-17 00:19
曾大鹏 发表于 2013-5-16 21:18
这题目以前搞acm写过,,发个c写的代码
恩恩,不错。不过最好用java写代码
作者:
逸盏清茶
时间:
2013-5-17 00:43
public static void main(String[] args)
{
int n,i;
Scanner input=new Scanner(System.in);
System.out.println("请输入一个正整数");
n =input.nextInt();
for(i=2;i<=n;i++)
{
while(n!=i)
{
if(n%i==0)
{
System.out.println(i);
n=n/i;
}
else
break;
}
}
System.out.println(n);
}
作者:
飞鸟青崖
时间:
2013-5-17 08:59
这道题通过递归的方法比较好求。
1,首先求出任意一个数的约数,这样就将这个数分成了两个数。
2,然后对这两个数求取质因数。这样递归下去就可以解决了。
下面是代码。不过没有考虑格式,只是把结果给直接输出来了。
import java.util.Scanner;
class MyTest{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
getPrime(num);
}
//获得一个数的约数。如果它本身但是一个素数,那么就返回它本身。
private static int getAppro(int n){
for(int x=2;x<=Math.sqrt(n);x++){
if(n%x == 0){
return x;
}
}
return n;
}
//求一个数的质因数。
private static void getPrime(int n){
if(n != getAppro(n)){//如果它本身不是素数,就将它分成两部分。
getPrime(n/getAppro(n));
getPrime(getAppro(n));
}
else//如果它是素数,就直接输出这个数。
System.out.println(n);
}
}
复制代码
作者:
曾大鹏
时间:
2013-5-17 09:02
王盟盟 发表于 2013-5-16 22:02
你这效率有问题的 如果这个N很大的话 你的程序出结果的时间会很慢的。。
应该考虑用刷选法把素数找出来的。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2