Java实现 蓝桥杯 算法提高 Monday-Saturday质因子

试题 算法提高 Monday-Saturday质因子

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  这个问题是个简单的与数论有关的题目,看起来似乎是“求正整数的所有质因子”,但实际上并不完全是这样。

本题中需要定义以下几个概念:
  1. Monday-Saturday数
  对于一个正整数N,如果它除以7得到的余数是1或6,则可以写成N=7k+{1,6}的形式。更形象的,我们把这样的N称作“Monday-Saturday数”,简称“MS数”。
  2. Monday-Saturday因子
  如果对于两个MS数a,b,若存在一个MS数x,使得ax=b,那么就称a是b的一个“Monday-Saturday因子”,简称“MS因子”。
  3. Monday-Saturday质数
  如果对于MS数a,满足a>1且除了1和a之外a没有其他的MS因子,那么称a是一个“Monday-Saturday质数”,简称“MS质数”。
  注:对于传统意义上的质数,若它是一个MS数,则它一定是一个MS质数。但反之不必成立,例如27,它是一个MS质数但不是传统意义上的质数。
  4. Monday-Saturday质因子
  如果对于两个MS数a,b,若满足a是b的MS因子且a是一个MS质数,那么称a是b的一个“Monday-Saturday质因子”。
  例如:27是216的一个MS质因子(216=27*8)。

问题就是,给定一个MS数N,求其所有的Monday-Saturday质因子。
输入格式
  每个输入数据包含多行,每行一个整数N(保证N一定是MS数,1<N<300000)。
  输入的最后一行是一个整数1(对于这一行,你不必输出任何信息)。
  每个输入数据不超过100行。
输出格式
  对于每个N输出一行,表示N的所有Monday-Saturday质因子,按从小到大的顺序输出。格式形如“N: p1 p2 p3 …… pk”,注意行末无多余空格。

【样例输入】
  205920
  262144
  262200
  279936
  299998
  1

【样例输出】
  205920: 6 8 13 15 20 22 55 99
  262144: 8
  262200: 6 8 15 20 50 57 69 76 92 190 230 475 575 874 2185
  279936: 6 8 27
  299998: 299998
数据规模和约定
  1<N<300000,每个输入数据不超过100行。

package com.company;

import java.util.ArrayList;
import java.util.Scanner;

public class Monday_Saturday质因子 {
    public static boolean [] Not_MS_Num = new boolean[300005];
    public static ArrayList<Integer> MS_Num = new ArrayList<>();
    public static int N;
    public static void main(String[] args) {
        //先把所有的MS数都循环出来
        for (int i = 6; i <= 300000; )
        {
            if (Not_MS_Num[i] == false)
            {
                MS_Num.add(i);
                for (int k = 6; k * i <= 300000; )
                {
                    Not_MS_Num[k * i] = true;
                    if (k % 7 == 6)
                        k += 2;
                    else
                        k += 5;
                }
            }
            if (i % 7 == 6)
                i += 2;
            else
                i += 5;
        }
        Scanner sc = new Scanner(System.in);
        //这里直接输入数进行判断
        N=sc.nextInt();
        while (N > 1)
        {
            System.out.print(N+":");

            for (int i = 0; i < MS_Num.size() && MS_Num.get(i) <= N; ++i)
            {
                if (N % MS_Num.get(i) == 0)
                    System.out.print(" "+MS_Num.get(i));
            }
            N=sc.nextInt();
            System.out.println();

        }


    }
}

posted @ 2020-02-10 11:47  南墙1  阅读(65)  评论(0编辑  收藏  举报