求JAVA中gcb函数_java经典程序编程知识(一)

Scanner scanner=new Scanner(System.in)

Scanner是一个类,nextXxx()是Scanner的成员函数,System.in作为参数传递给Scanner的构造函数,使Scanner用键盘作为输入,然后用new在内存中实例化一个Scanner出来,使得其它变量能调用这块内存区。

next()与nextLine()读取字符串

next():

一定要读取到有效字符后才可以结束输入。

对输入有效字符之前遇到的空白,next()方法会自动将其去掉。

next()不能得到带有空格的字符串。

nextLine():

以Enter为结束符,nextLine()方法返回的是输入回车之前的所有字符,可以获得空白。

while (scanner.hasNextDouble()) {//判断输入的是不是double,如果输了别的按下enter后会终止

double x = scanner.nextDouble();//读取double型

}

【程序2】

题目:判断101-200之间有多少个素数,并输出所有素数。

public static void main(String[] args) {

int n=0;

System.out.println("101-200间的素数有:");

for(int i=101;i<=200;i++){

if(isRight(i)){

System.out.print(i+" ");

n++;

if(n%5==0){

System.out.println();

}

}

}

System.out.println("共有"+n+"个素数");

}

private static boolean isRight(int n){

for(int i=2;i<=Math.sqrt(n);i++){

if(n%i==0){

return false;

}

}

return true;

}

为什么用Math.sqrt(m):

因为如果m能被2~m-1之间任一整数整除,其二个因子必定有一个小于或等于√m,另一个大于或等于√m。例如16能被2,4,8整除,16=28,2小于4,8大于4,16=44,4=√16,因此只需判定在2~4之间有无因子即可

long startTime=System.currentTimeMillis(); //获取开始时间(毫秒)

doSomeThing(); //测试的代码段

long endTime=System.currentTimeMillis(); //获取结束时间

long startTime=System.nanoTime(); //获取开始时间(纳秒)

水仙花数求法

public static void main(String[] args) {

int m,n,t;

for(int i=100;i<1000;i++){

m=i%10;

n=i/10%10;

t=i/100;

if(i==(m*m*m)+(n*n*n)+(t*t*t)){

System.out.print(i+" ");

}

}

}

【程序4】

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

public class Programme {

public static void main(String[] args) {

Scanner scanner=new Scanner(System.in);

System.out.println("请输入一个正整数:");

int n=scanner.nextInt();

System.out.print(n+"=");

for(int i=2;i<=n;i++){

while(n%i==0&&i!=n){//当要除以4时前面除以2的时侯已经除完,达到了选出质数的效果

System.out.print(i+"*");

n=n/i;

}

if(n==i){

System.out.println(i);

}

}

scanner.close();

}

}

两个数的最大公约数(Greatest Common Divisor)的求法

辗转相除法

辗转相除法也叫欧几里得算法,是一种非常古老的求解两个数的最大公约数的算法。其基于的原理:两个正整数a和b(a > b),它们的最大公约数gcd等于a除以b的余数r和b之间的最大公约数。比如,10和25的最大公约数5等于25除以10的余数5和10的最大公约数;再比如51和21的最大公约数3等于51除以21的余数9和21的最大公约数,而9和21的最大公约数为3。根据上面的原理,辗转相除法的算法流程可以如下:

步骤1:计算a与b的余数r。

步骤2:如果r为0,则返回gcd = b。否则,转到步骤3。

步骤3:使用b的值更新a的值,使用余数r更新b的值,转到步骤1。

long Gcd(long a,long b){

return (a%b==0)?b:(Gcd(b,a%b));

}

等等,为什么不对a和b的大小进行判断呢?上面的算法原理中不是要求a大于b吗?如果调用时a值大于b值,比如a为51,b为21,那么情况跟上述算法原理是相符的。如果调用时a值小于b值,比如a为21,b为51,那么,21除以51的余数r为21,不为0,于是接着调用GetGCD(51, 21),看到了没?这就和a > b的情况是一样的了。也就是说我们根本无需判断a和b的大小,当a值小于b值时,算法的下一次递归调用就能够将a和b的值交换过来。

最小公倍数=A*B/gcb

假设两数为A,B,A=ca,B=cb;a,b互质(公约数只有1的两个整数),gcb=c,最小公倍数肯定是abc=A*B/gcb。

凡是属于IO流的类如果不关闭会一直占用资源.要养成好习惯用完就关掉

boolean bool;//bool的值不是false

int[] arr=new int[n];//创建数组

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值