java求素数和求一个数的一个正整数的质因数

1、题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少对?

  (1)程序分析:不难发现兔子的规律是:1,1,2,3,5,8,13,21....

    其实这个问题也就是求斐波那契数列的问题。

  (2)思路:应用递归来实现。1,2月的时候总数为一对,从第三个月开始就会产生一个新兔子,总数为2对,也就是born(n-1)+born(n-2)

  (3)代码实现:

 1 /**
 2  * 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
 3  * @author lixiaochao
 4  * 兔子的规律为:1,1,2,3,5,8,13,21....
 5  */
 6 public class Rabbit {
 7     public static void main(String[] args) {
 8         int n = 5;   //
 9         int m = 0;   //兔子总数
10         m = born(n);
11         System.out.println("一共有"+m);
12     }
13     public static int born(int n){
14         if(n == 1){
15             return 1;
16         }else if(n == 2){
17             return 1;
18         }else{
19             return born(n-1)+born(n-2);
20         }
21     }
22     
23 }

  总结:当时看这个问题的时候,一看有点绕,而且很容易绕晕了,我们现在开始把他列举一下,从而发现出规律,然后转换一下求斐波那契数列的问题,这个问题就会很容易做了。

    有的时候我们可以转换一下思路,问题有可能会变得很简单的。

2、判断101-200之间有多少个素数,并输出所有的素数,

  (1)分析:首先我们要先了解判断素数的方法是什么,用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。这种方法非常简单效率也非常快。

  (2)思路:略。(因为比较简单,所以省略掉了,如果大家对这个有疑问,可以留言告诉我)

  (3)代码:

 1 /**
 2      * 判断101-200之间有多少个素数,并输出所有素数。
 3      * 
 4      * 分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数
 5      */
 6 //    @Test
 7     public void test01(){
 8         int num = 0;
 9         
10         List<Integer> list = new ArrayList<Integer>();
11         for(int i = 101; i < 201; i++){
12             boolean flag = true;   //每次执行的时候把flag置为true
13             for(int j = 2; j < Math.sqrt(i)+1;j++){
14                 if(i % j == 0){
15                     flag = false;
16                     break;
17                 }
18             }
19             if(flag){
20                 num ++;
21                 list.add(i);
22                 System.out.println(i);
23             }
24         }
25         System.out.println("素数的个数为:"+num);
26         for(Integer n : list){
27             System.out.println(n);
28         }
29     }
30     

  总结:对于问题,我们要先想好解决问题的最好的方法,不要急于写代码,找到合理的算法才是解决问题最有效的途径。

3、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 

  (1)分析:

    对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成: 

    * (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
    * (2)如果n > i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数,重复执行第一步。
    * (3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步。

  (2)思路:先找到一个最小的质数i,这个数n是否能够整除这个最小的质数i,如果能整除,则n=n/i,如果不能整除,i=i+1,在再判断这个是n是否能够整除i+1,当这个质数恰好等于n的时候分解质因数结束。

  (3)代码如下:

 1 /**
 2      * 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 
 3      * 程序分析:对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成: 
 4      * (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
 5      * (2)如果n > i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数,重复执行第一步。
 6      * (3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步。
 7      * 
 8      */
 9     @Test
10     public void test(){
11         int n = 7;
12         int i = 2;
13         while(true){
14             if(n == i){
15                 System.out.println(i);
16                 break;
17             }
18             if(n%i == 0){
19                 System.out.println(i);
20                 n = n / i;
21             }else{
22                 i = i+1;
23             }
24         }
25     }

  总结:多看,多想,多练!!!

转载于:https://www.cnblogs.com/lixiaochao/p/5666695.html

Java中,我们可以编写一个程序来接收用户输入的正整数,然后分解出它的质因数,并计算每个质因数每位上的字之和。下面是一个简单的示例: ```java import java.util.Scanner; public class PrimeFactorSum { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个正整数:"); // 获取用户输入 int number = scanner.nextInt(); int sumOfDigitsInPrimeFactors = primeFactorSum(number); // 输出结果 if (sumOfDigitsInPrimeFactors > 0) { System.out.printf("该的所有质因数各位字之和为:%d%n", sumOfDigitsInPrimeFactors); } else { System.out.println("该质因数!"); } scanner.close(); } /** * 计算给定整质因数及其每位字之和 */ public static int primeFactorSum(int num) { int sum = 0; for (int i = 2; i <= num; i++) { // 只需检查到num开根号即可,因为大于num的因子不可能是质数 while (num % i == 0) { // 如果i是质因数 String factor = Integer.toString(i); sum += factor.chars().map(Character::getNumericValue).sum(); // 加入因子每位字之和 num /= i; } } return sum; } } ``` 在这个程序中,我们首先获取用户的输入,然后调用`primeFactorSum`函来找出并计算质因数的各位字之和。这个函通过迭代,不断尝试将原除以当前较小的质数,直到它不再能被整除为止。 运行此程序后,按照提示输入一个正整数,它会显示所有质因数各位字之和。如果输入的没有质因数,程序会输出相应的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值