首先鄙人不才,胡抄乱写得罪之处请见谅
public class lianxi{
public static void main(String []args){
//99乘法表
test1();
test2();
test3();
//获取质数
test4(100000);
test5(100000);
test6(100000);
test7(100000);
}
//左上角
private static void test1(){
for(int i = 1;i<=9;i++){
for(int j =i; j <= 9 ; j++)
{
System.out.print(i+"x"+j+"="+(i*j)+"\t");
}
System.out.println();
}
}
//右下角
private static void test2(){
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9-i;j++){
System.out.print("\t");
}
for(int k = 1;k<=i;k++){
System.out.print(k+"x"+i+"="+(i*k)+"\t");
}
System.out.println();
}
}
//凑数的,本想是能右上角的,哎,太菜了,左下角也没成功,知道的麻烦教教我。
private static void test3(){
for(int i =9;i >= 1;i--){
for(int k = 1;k <= 9;k++){
System.out.print(" \t");
}
for(int j =1 ;j<=i;j++){
System.out.print(j+"x"+i+"="+(i*j)+"\t");
}System.out.println();
}
}
//这里开始取质数
private static void test4(int n){
//开始时间
long start = System.currentTimeMillis();
int num = 0;
boolean sign;
for(int i = 2;i < n;i++){
/**
*这里的%和&&贴在这了
*运算符 / :除法运算符,并且运算结果遵从向下取整。
*运算符 % :模运算,
* (1)、当运算符左边小于右边,结果就等于左边;
* (2)、当运算符左边大于右边,就和算术中的取余是一样的效果。
*Java中&&和&都是表示与的逻辑运算符,都表示逻辑运输符and,当两边的表达式都为true的时候,整个运算结果才为true,否则为false。
*&&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式;&则两个表达式都执行。
*&可以用作位运算符,当&两边的表达式不是Boolean类型的时候,&表示按位操作。
*/
if(i % 2==0 &&i !=2) continue;
//这里的continue和下面的brek都是跳出,但continue是跳出本次循环,继续执行下次循环。
sign=true;
for(int j = 2 ;j<i;j++){
if(i%j==0){
sign=false;
break;
}
}
if(sign){
num++;
}
}
System.out.println(n+"Primes within are"+num+"individual");
//结束时间
long end = System.currentTimeMillis();
//计算使用时间
System.out.println("The time cosr is "+(end - start));
System.out.println("");
}
private static void test5(int n){
long start = System.currentTimeMillis();
int num = 0;
int j;
boolean sign;
for(int i = 2;i <=n;i++){
if(1 % 2==0&&i != 2) continue;
sign = true;
//和上面不一样的是这里的j <=i/2,这样他的效率会提升一般,为什么呢?
for(j = 2;j <= i/2; j++){
if (i % j ==0 ){
sign = false;
break;
}
}
if (sign){
num++;
}
}
System.out.println(n+"Primes within are"+num+"individual");
long end = System.currentTimeMillis();
System.out.println("The time cosr is "+(end - start));
System.out.println("");
}
private static void test6(int n){
long start = System.currentTimeMillis();
int num = 0;
int j;
boolean sgin;
for(int i = 2;i<=n;i++){
if(1%2==0 && i!=2) continue;
sgin = true;
//这次就不一样了,因为我用了Math.sqrt,效率~来的太快,就像龙卷风~摧毁停车场!
//为啥这么叼呢,因为此方法返回一个正平方根。
for(j = 2;j<=Math.sqrt(i);j++){
if(i%j==0){
sgin = false;
break;
}
}
if(sgin){
num++;
}
}
System.out.println(n+"Primes within are"+num+"individual");
long end = System.currentTimeMillis();
System.out.println("The time cosr is "+(end - start));
System.out.println("");
}
private static void test7(int n){
long start = System.currentTimeMillis();
//素数的总和
int sum = 0 ;
//一开始默认全部为素数,所以值全部为0,等到开始筛选的时候再把为合数的赋值为1
//为啥素数为0,合数为1?。。。。。因为我愿意
int num[] = new int[n];
num[0] = 1; //因为1规定不是素数,所以提前用1标值
double prescription = Math.sqrt(n);
//这里把所有素数的倍数剔除,剩下的就是素数
for(int i = 2;i<=prescription;i++){
//从i*i开始去除,因为比i*i小的倍数,已经在前面去掉了
//例如:i=5
//5的2倍(10),3倍(15),在i=2的时候,已经去掉了
for(int j = i*i;j <= n;j+=i){
num[j-1] = 1;
}
}
//这是做什么?
//遍历数组,把值为0的数全部统计出来,得到素数之和
for (int i = 0;i<num.length; i++){
if(num[i]==0){
sum++;
}
}
System.out.println(n+"Primes within are"+sum+"individual");
long end = System.currentTimeMillis();
System.out.println("The time cosr is "+(end - start));
System.out.println("");
}
}
这里是运行后结果,是按照顺序排序的,可以见到的是,四种获取质数的方法,效率逐步提升。
什么?那些是质数的结果?下面那个,对,100000后面的,英文太差,百度翻译拼凑的。
以下,废话
有抄袭,原主请看到了告诉我,我改。反正,删除是不可能删除的了,人家发的第一章,这辈子都不带删除的/。