云上day-15

题目描述

任意输入两个正整数 m,n(2≤mn≤5000),依次输出 m 到 n 之间每个数的最大质因子(包括 m 和 n;如果某个数本身是质数,则输出这个数自身)。

题目链接:B2138 最大质因子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

输入格式

一行,包含两个正整数 m 和 n,其间以单个空格间隔。

输出格式

一行,每个整数的最大质因子,以逗号间隔。

解题思路

根据题目描述,我们应该遍历 m 到 n 之间的所有数 i,首先判断这个数是否为素数,如果是则直接输出;如果不是的话,需要通过 for 循环去求数 i 的所有质因子(即该数既是数 i 的因子又是质数),并更新。

但是大家输出的时候注意格式要求!

解题代码

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;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值