题目描述
任意输入两个正整数 (2≤≤≤5000),依次输出 到 之间每个数的最大质因子(包括 和 ;如果某个数本身是质数,则输出这个数自身)。
题目链接:B2138 最大质因子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
输入格式
一行,包含两个正整数 和 ,其间以单个空格间隔。
输出格式
一行,每个整数的最大质因子,以逗号间隔。
解题思路
根据题目描述,我们应该遍历 到 之间的所有数 ,首先判断这个数是否为素数,如果是则直接输出;如果不是的话,需要通过 循环去求数 的所有质因子(即该数既是数 的因子又是质数),并更新。
但是大家输出的时候注意格式要求!
解题代码
C代码
#include<stdio.h>
#include<math.h>
int isPrime(int n);//判断质数函数
void MaxPrime(int n);//求最大质因数函数
int main(){
int m,n;
scanf("%d %d",&m,&n);
for(int i = m; i <= n; i++){
MaxPrime(i);
if(i != n)
printf(",");
}
return 0;
}
int isPrime(int n)
{
for(int i = 2; i <= sqrt(n); i++){
if(n % i == 0)
return 0;
}
return 1;
}
void MaxPrime(int n)
{
if(isPrime(n) == 1)//若其本身就是质数则可直接求得是它本身
{
printf("%d",n);
return;
}
for(int i = n/2; i >= 2; i--)//倒着找判断次数更少
{
if(n % i == 0 && isPrime(i) == 1)
{
printf("%d",i);
return;
}
}
}
C++代码
//定义头文件
#include<iostream>
#include<cmath>
using namespace std;
//注意输出格式:第一个数前面不用加,,其余数前面要加,
//判断是否为质数
//是质数返回真
bool isPrime(int num){
for (int i = 2; i <= sqrt(num); i++){
if(num % i == 0)return false;
}
return true;
}
//求最大质因子
int maxPrime(int num){
int maxprime = 2;//定义最大质因子为2,2肯定是每个数的质因子(题目所有数都大于等于2)
for (int i = 3; i <= num; i++){
if(num % i == 0 && isPrime(i)){//如果i是num的因子,并且i是素数,则更新maxprime
maxprime = i;
}
}
return maxprime;//最后要返回这个最大质因子
}
int main(){
//输入数据
int m, n;
cin>>m>>n;
//遍历m到n之间的数
for (int i = m; i <= n; i++){
//先判断这个数是否为质数
if(isPrime(i)){
//如果这个数是质数,那么输出这个数本身
if(i == m){//如果这个数是第一个数,那么不加,
cout<<i;
}else{//否则要加
cout<<","<<i;
}
}else{
//如果这个数不是质数
//调用函数求最大质因子并输出
//注意输出格式
if(i == m){
cout<<maxPrime(i);
}else{
cout<<","<<maxPrime(i);
}
}
}
return 0;
}
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入数据
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
//循环遍历m到n之间的数
for (int i = m; i <= n; i++){
//判断是否为素数
if(isPrime(i)){
//注意格式
if(i == m){
System.out.print(i);
}else{
System.out.print("," + i);
}
}else{
if(i == m){
System.out.print(maxPrime(i));
}else {
System.out.print("," + maxPrime(i));
}
}
}
}
//判断是否为素数
public static boolean isPrime(int num){
for (int i = 2; i <= Math.sqrt(num); i++){
if(num % i == 0){
return false;
}
}
return true;
}
//求最大质因子
public static int maxPrime(int num) {
int maxprime = 2;
for (int i = 3; i <= num; i++) {
if (num % i == 0 && isPrime(i)) {
maxprime = i;
}
}
return maxprime;
}
}