约数与素数

好吧,今天一整天都是用循环求各种数,想破了我的小脑袋啊!

参考: 《Java语言程序设计(基础篇)》P—161

所谓素数,就是只能被1和它自身整除的数字。

约数,我想大家都应该知道公约数吧,那么,我们就先从简单的求一个数的最小因子/约数

开始 !

【demo是项目名称,Welcome是公共类名,和java文件的前缀名是一样的,首字母必须大写】

 1 package demo;
 2
 3 public class Welcome {
 4     public static void main(String[] args) {
 5         int factor = 9;
 6         int divisor = 2;
 7
 8         while (divisor < factor) {
 9             if (factor % divisor == 0)
10                 break;
11             divisor++;
12         }
13         System.out.println(factor + "除1之外的最小约数是: " + divisor);
14     }
15 }

break 是用来跳出while循环用的!

-------------------------------------------------------------------------------------------------

接下来是稍微难一点的求两数的最大公约数

【公约数是指能同时被两个整数整除的数: 所以下面用到了&&,表示"和"的意思】

 1 package demo;
 2
 3 import java.util.Scanner;
 4
 5 public class Welcome {
 6     public static void main(String[] args) {
 7         Scanner input = new Scanner(System.in);
 8
 9         System.out.print("输入两个整数: ");
10         int num1 = input.nextInt();
11         int num2 = input.nextInt();
12         int gcd = 2;
13         int divisor = 2;
14
15         while (divisor <= num1 && divisor <= num2) {
16             if (num1 % divisor == 0 && num2 % divisor == 0) {
17                 gcd = divisor;
18             }
19             divisor++;
20         }
21         System.out.println(num1 + "和" + num2 + "的最大公约数是: " + gcd);
22     }
23 }

最大公约数

因为我们要求出的是最大的那个公约数,所以要让divisor(被除数, divisor++;)每次自增1, 直到大于

num1或num2为止。这样,最后一个可以被整除的数( gcd = divisor; )就是最大公约数啦!

---------------------------------------------------------------------------------------------------

Q~Q Boss登场,该是求素数的时候啦! ! !

 1 package demo;
 2
 3 public class Welcome {
 4     public static void main(String[] args) {
 5         System.out.println("显示从2开始的前五十个素数: ");
 6
 7         int count = 0;
 8         int num = 2;
 9
10         while (count < 50) {
11             boolean isPrime = true;
12             for (int divisor = 2; divisor <= num / 2; divisor++) {
13                 if (num % divisor == 0) {
14                     isPrime = false;
15                     break;
16                 }
17             }
18                 /** 这里的println表示打印完后自动换行, 由于我们每行要放十个素数,
19                                     所以在第十个数打印完后要换行, 因此在少于十个数时用先用print, 然
20                                     后在第十个数之后用println **/
21
22                 if (isPrime) {
23                     count++;
24                     if (count % 10 == 0)
25                         System.out.println(num);
26                     else
27                         System.out.print(num + " ");
28                 }
29                 num++;
30         }
31     }
32 }

显示前五十个素数

【注意: 这里易错点是把boolean isPrime = true;放在循环前面。这样一旦遇到第一个非素数4,isPrime将永远是false】

只打印非素数4之前的两个素数......

正确的结果:

时间: 2024-08-08 09:42:12

约数与素数的相关文章

最大约数个数算法分析

   最大约数个数算法分析   实验问题描述 正整数x的约数是能整除x的正整数.正整数x的约数个数记为div(x),例如,1,2,5,10都是正整数10的约数,且div(10)=4.设a和b是2个正整数,a<=b,找出a和b当中约数个数最多的数x,输出其约数个数值.   实验目的 本次实验通过利用数论知识,建立素数表,弥补累除法在时间复杂度上的缺陷,同时又结合累除法在小范围内能够计算出最准确的约数个数的特性, 在时间复杂度上获得最大的优化.   实验知识准备过程 累除法的基本思想:计算正整数a的

BZOJ2721 [Violet 5]樱花

先令n! = a: 1 / x + 1 / y = 1 / a  =>  x = y * a / (y - a) 再令 k = y - a: 于是x = a + a ^ 2 / k  =>  k | a ^ 2 故等价于求a ^2的约数个数 素数筛一下什么的就好了嘛 1 /************************************************************** 2 Problem: 2721 3 User: rausen 4 Language: C++ 5

「整理」勾股数组

我们大概老早就知道勾股定理,它大概就长这样: \[a^2+b^2=c^2\] 嗯,的确够简单的. 而且我们清楚地知道它的一个基本应用--知道\(Rt\Delta\)的两边长,求第三边.这大概初一就学了. 对于不知道勾股定理的童鞋们,不了解没关系,因为这里没有三角形,也不是探讨怎么求第三边,我们只探讨勾股数组. 这里的\(a \equiv b(mod\ c)\)其实就是\(a\%c=b\%c\),a|b其实就是\(b\%a=0\),希望小白们不要看不懂. 如果真的看不懂,可以先学习同余.约数.素数

【线性筛】【筛法求素数】【约数个数定理】URAL - 2070 - Interesting Numbers

素数必然符合题意. 对于合数,如若它是某个素数x的k次方(k为某个素数y减去1),一定不符合题意.只需找出这些数. 由约数个数定理,其他合数一定符合题意. 就从小到大枚举素数,然后把它的素数-1次方都排除即可. #include<cstdio> #include<cmath> using namespace std; #define MAXP 1000100 #define EPS 0.00000001 typedef long long ll; ll L,R; bool isNo

数论线性筛总结 (素数筛,欧拉函数筛,莫比乌斯函数筛,前n个数的约数个数筛)

线性筛 线性筛在数论中起着至关重要的作用,可以大大降低求解一些问题的时间复杂度,使用线性筛有个前提(除了素数筛)所求函数必须是数论上定义的积性函数,即对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数,若a,b不互质也满足的话则称作完全积性函数,下面说明每个筛子是怎么筛的. 最基础的是素数筛,其它三个筛都是以素数筛为前提 素数筛 void get_prime() { int pnum = 0; for(int i = 2;

判断素数 一个数的约数 一个整数的幂次约分

1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 #include<map> 5 using namespace std; 6 7 //素数测试 8 bool is_prime(int n) 9 { 10 for(int i=2; i*i <= n; i++) 11 { 12 if(n%i==0) return false; 13 } 14 } 15 16 //约数枚举 17

[线性筛][筛素数/筛约数个数]

线性筛中每个数只会被最小的素因子筛一次 1)线性筛素数 1 void getprime(int siz){ 2 memset(isprime,1,sizeof(isprime)); 3 isprime[1]=0; 4 for(int i=2;i<=siz;i++){ 5 if(isprime[i])prime[++tot]=i; 6 for(int j=1;j<=tot&&i*prime[j]<=siz;j++){ 7 isprime[i*prime[j]]=0; 8 i

【搜索】【约数个数定理】[HAOI2007]反素数ant

对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数. 所以,n以内的反质数即为不超过n的约数个数最多的数. 怎样计算约数个数? 约数个数定理:对于一个大于1正整数n可以分解质因数:n=p1^a1*p2^a2*p3^a3*…*pk^ak,则n的正约数的个数就是(a1+1)(a2+1)(a3+1)…(ak+1) .其中a1.a2.a3…ak是p1.p2.p3,…pk的指数. 所以,只需枚举一个数的所

177. 有限制的素数

177. [USACO Jan07] 有限制的素数 ★   输入文件:qprime.in   输出文件:qprime.out   简单对比 时间限制:1 s   内存限制:128 MB Farmer John 开始给奶牛们标记上素数的牌子,贝茜注意到了这一切,她对各种数的牌子很好奇. 请帮助贝茜算出从A到B (1 ≤ A ≤ B ≤ 4,000,000; B ≤ A + 1,000,000; B ≤ A + 2,000,000 ),其中包含数字D的素数的个数. 素数是只有两个两个约数(1 和 它