知识点
疑问
暂无
代码
//直接设定了N的大小是int型
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1e6;
//用于存放质数的数组
int prime[maxn],pNum=0;
bool p[maxn] = {0};
struct factor{
int x;
int cnt; //记得初始化
}fac[10];
//质因子种类数
int num=0;
//输入的数
int n;
void Find_Prime(int sqr){
//sqr用于表示打表的上限
for(int i=2;i<=sqr;i++){
if(p[i] == false){
prime[pNum++] = i;
for(int j=i+i;j<=sqr;j+=i){
p[j] = true;
}
}
}
}
int main(){
scanf("%d",&n);
//特判0
if(n == 1){
printf("1=1");
return 0;
}
int pre = n;
//首先打表计算有多少质数,从[2,sqrt(n)]
int sqr = (int) sqrt(1.0 * n);
Find_Prime(sqr);
//打表完成,开始计算质因子,遍历所有的质因子
for(int i=0;i<pNum;i++){
if(n % prime[i] == 0){
fac[num].x = prime[i];
fac[num].cnt = 0;
while(n % prime[i] == 0){
fac[num].cnt++;
//n一直在变化
n = n / prime[i];
}
num++;
}
}
//这里的n已经不再是原来的n了
if(n != 1){
fac[num].x = n;
fac[num].cnt = 1;
num++;
}
//打印输出
printf("%d=",pre);
for(int i=0;i<num;i++){
if(fac[i].cnt==1){
printf("%d",fac[i].x);
}else{
printf("%d^%d",fac[i].x,fac[i].cnt);
}
if(i != num-1){
printf("*");
}
}
return 0;
}
反思
- 第一次提交的时候,测试点0运行超时。后来检查发现,是自己的常量
maxn
定义小了,原来是1e4
,后来改成了1e6
就没有运行超时了。所以呢,在我们打表之前,一定要好好思考一下这个maxn
应该要多大! - 要特判1的情况。‘
二刷代码
- 一个小细节是,我忘记考虑打印素数表了!我只设置了是否是素数,我佛了,我不在状态啊
//质因子分解模板题
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1e5+10;
bool p[maxn]={0};
struct factor{
int cnt;
int x;
}factors[10];
int num=0;
void findPrime(){
p[0]=true,p[1]=true;
for(int i=2;i<maxn;i++){
if(!p[i]){
for(int j=i+i;j<maxn;j+=i){
p[j]=true;
}
}
}
return;
}
int main(){
int n;
scanf("%d",&n);
if(n==1){
printf("1=1");
return 0;
}
int pre=n;
//首先进行打表
findPrime();
//接下来开始操作
int sqr = (int) sqrt(1.0*n);
for(int i=2;i<=sqr;i++){
if(!p[i]&&n%i==0){
factors[num].x = i;
factors[num].cnt = 0;
while(n % i == 0){
factors[num].cnt++;
n = n/i;
}
num++;
}
}
if(n!=1){
factors[num].x = n;
factors[num].cnt = 1;
num++;
}
printf("%d=",pre);
for(int i=0;i<num;i++){
printf("%d",factors[i].x);
if(factors[i].cnt>1){
printf("^%d",factors[i].cnt);
}
if(i!=num-1){
printf("*");
}
}
return 0;
}
打印了素数表的:
//质因子分解模板题
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1e5+10;
bool p[maxn]={0};
int prime[maxn];
struct factor{
int cnt;
int x;
}factors[10];
int num=0;
int pNum=0;
void findPrime(){
p[0]=true,p[1]=true;
for(int i=2;i<maxn;i++){
if(!p[i]){
prime[pNum++]=i;
for(int j=i+i;j<maxn;j+=i){
p[j]=true;
}
}
}
return;
}
int main(){
int n;
scanf("%d",&n);
if(n==1){
printf("1=1");
return 0;
}
int pre=n;
//首先进行打表
findPrime();
//接下来开始操作
int sqr = (int) sqrt(1.0*n);
for(int i=0;prime[i]<=sqr;i++){
if(n%prime[i]==0){
factors[num].x = prime[i];
factors[num].cnt = 0;
while(n % prime[i] == 0){
factors[num].cnt++;
n = n/prime[i];
}
num++;
}
}
if(n!=1){
factors[num].x = n;
factors[num].cnt = 1;
num++;
}
printf("%d=",pre);
for(int i=0;i<num;i++){
printf("%d",factors[i].x);
if(factors[i].cnt>1){
printf("^%d",factors[i].cnt);
}
if(i!=num-1){
printf("*");
}
}
return 0;
}