本题考查
埃氏筛
分析
JAVA代码第一个用例会提示内存超限,但从C++运行结果看,这几个用例规模应该差别不大,不知道为啥JAVA代码第一个用例会超限。
埃氏筛:用于生成质数表。算法原理:从最小的质数2开始,将2的倍数设为非质数标志,然后3…,之后的循环当该数字没有非质数标志时则把其倍数添加非质数标志。
质因数分解:从最小的质数开始,并将当前质数设为prime,用待分解的数字num除以prime,若整除,则继续num除以prime,并将num赋值为num / prime,若不整除,则将prime赋值为下一个质数,持续循环直到num等于1。
代码
- JAVA代码
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
//埃拉托斯特尼筛法
static ArrayList<Integer> prime(int j) {
ArrayList<Integer> al = new ArrayList<Integer>();
boolean[] flag = new boolean[j + 1];
flag[0] = flag[1] = true;
for(int i = 2 ; i < j + 1 ; i++) {
if(flag[i] == false) {
al.add(i);
for(int k = i + i ; k < j + 1 ; k+=i) {
flag[k] = true;
}
}
}
return al;
}
public static void main(String[] args) {
Scanner scaner = new Scanner(System.in);
int num = scaner.nextInt();
scaner.close();
if(num != 1) {
System.out.print(num + "=");
ArrayList<Integer> prime = prime(num);
int size = prime.size();
int[] e = new int[size];
int index = 0;
for(int i = 0 ; i < size ; i++) {
int divisor = prime.get(i);
while(true) {
if(num >= divisor && (num%divisor == 0)) {
e[i]++;
num = num / divisor;
}
if(num >= divisor && (num%divisor != 0)){
break;
}
if(num == 1) {
index = i;
break;
}
}
if(num == 1)
break;
}
for(int i = 0 ; i <= index ; i++) {
if(e[i] > 0) {
if(e[i] == 1&&i != index) {
System.out.print(prime.get(i) + "*");
}
if(e[i] == 1&&i == index) {
System.out.print(prime.get(i));
}
if(e[i] > 1&&i != index) {
System.out.print(prime.get(i) + "^" + e[i] + "*");
}
if(e[i] > 1&&i == index) {
System.out.print(prime.get(i) + "^" + e[i]);
}
}
}
}
else
System.out.println("1=1");
}
}
- C++代码(来源)
#include <cstdio>
#include <cmath>
const int maxn=100010;
int flag[maxn]={false},prime[maxn],pNum=0;
void find_prime()
{
flag[0]=flag[1]=true;
for(int i=2;i<maxn;++i)
{
if(flag[i]==false)
{
prime[pNum++]=i;
for(int j=i+i;j<maxn;j+=i)
{
flag[j]=true;
}
}
}
}
struct factor
{
int cnt;
int x;
}fac[10];
int main()
{
int n;
scanf("%d",&n);
find_prime();
if(n==1)
printf("%d=%d\n",n,n);
else
{
printf("%d=",n);
int num=0;
int sqr=(int)sqrt(n*1.0);
for(int i=0;prime[i]<=sqr;++i)
{
if(n%prime[i]==0)
{
fac[num].x=prime[i];
fac[num].cnt=0;
while(n%prime[i]==0)
{
++fac[num].cnt;
n/=prime[i];
}
++num;
}
}
if(n!=1)
{
fac[num].x=n;
fac[num++].cnt=1;
}
if(fac[0].cnt==1)
printf("%d",fac[0].x);
else
printf("%d^%d",fac[0].x,fac[0].cnt);
for(int i=1;i<num;++i)
{
if(fac[i].cnt==1)
printf("*%d",fac[i].x);
else
printf("*%d^%d",fac[i].x,fac[i].cnt);
}
printf("\n");
}
return 0;
}