14.循环控制
在for循环中,我们在达到某个条件后可以用break来跳出一轮循环,continue就是跳过这一轮,直接进入下一轮的循环。
eg:有1234四个人唱歌,1唱到一半,老师说停,2唱,就是continue。如果1唱到一半,老师说,都别唱了,就是break。
判断是否为素数
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in =new Scanner(System.in);
int n=in.nextInt();
int X=1;
for (int i = 2; i < n; i++) {
if (n%i == 0) {
X=0;
System.out.println(n+"不是素数"+"i="+i);
break;
}
}
if(X==1) {
System.out.println(n+"是素数");
}
}
}
14.1:引入逻辑类型boolean:
eg1:
x∈(4,6)或者 x∈[4,6]
例如4<x<6,java表示无法接受,因为4<x的结果是一个逻辑值,逻辑值是不能和数值6去做计算
所以应该用 x>4&&x<6 或者 x>=4&&x<=6来表示
eg2:int n=in.nextInt();
if(!n>0) {
}
这是错误的 !是逻辑类型,不能用于int,但是可以用于n>0这个结果,所以要加上括号。
优先级介绍:
14.2 多重循环
若是多重循环的情况,可以在循环最前面添加XX:,而在最后输出那里加入break XX;
eg:如何用1,5,10,20元 凑出xx元。(break:和contiune:)
Scanner in= new Scanner(System.in);
int amount=in.nextInt();
AK:for (int one=0;one<=amount;one++)
{
for (int five=0;five<=amount/5;five++)
{
for (int ten=0;ten<=amount/10;ten++)
{
for (int twenty=0;twenty<=amount/20;twenty++)
{
if(one+five*5+ten*10+twenty*20==amount)
{
System.out.println(one+"张一元,"+five+"张五元,"+ten+"张十元,"+twenty+"张二十元");
break AK;
}
}
}
}
}
PS:多重循环,举个简单的例子。
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
System.out.println("/t"+(i*j));
}
System.out.println();
}
当i=1的时候,j要做9次,当i=2的时候,j要做九次---------i>9.
14.3循环的例子(1)
Scanner in = new Scanner(System.in);
int n=in.nextInt();
double result=0.0;
for(int i=1;i<=n;i++)
{
result+=1.0/i;
}
System.out.println(result);
System.out.printf("%.2f",result);
启示:System.out.printlnf("%,nf",result) N为保留的小数
错误例子嘛————System.out.printlnf("%,nf"+result)
(2)
法一:通过对2取余来判断奇偶性,进行分类加法。
Scanner in = new Scanner(System.in);
int n=in.nextInt();
double result=0.0;
for(int i=1;i<=n;i++)
{
if(i%2==0)
{
result+=-1.0/i;
}
else
{
result+=1.0/i;
}
}
System.out.println(result);
System.out.printf("%.3f",result);
法二:通过变量赋值±
Scanner in = new Scanner(System.in);
int n=in.nextInt();
double result=0.0;
/*符号变量*/int digit =1;
for(int i=1;i<=n;i++,digit=-digit;)
{
result+=digit*1.0/i;
}
System.out.println(result);
System.out.printf("%.3f",result);
(3)最大公约数:
Scanner in = new Scanner(System.in);
int a=in.nextInt();
int b=in.nextInt();
int d=1;
for(int c=2;c<=a&&c<=b;c++)
{
if(a%c==0&&b%c==0)
{
d= c;
}
}
System.out.println(a+"和"+b+"的最大公约数为:"+d);
能算,不过很麻烦。
不过有个疑问:为什么我前面int b;(不是上面那个int b=1;)并且在if中c已经赋值给d,为何后面输出d的时候会显示错误?
出bug了,我服了,复制粘贴一遍就行了就离谱,是都可以的
(4)辗转相除法
Scanner in = new Scanner(System.in);
int a=in.nextInt();
int b=in.nextInt();
int oa=a;
int ob=b;
while(b!=0)
{
int r=a%b;
a=b;
b=r;
}
System.out.println(oa+"和"+ob+"的最大公约数为:"+a);
**小陷阱:**a,b在while中做完赋值计算后,输出的a,b已经不是原来的a,b。所以要在前面赋值的时候补充两个变量并赋予a和b的 初始值,让输出的时候方便一些。
作业:前五十个素数,理解for的多重循环。