循环结构类习题
题目分析:拿到题目首先根据题目可得,提示用户要求输入一些数字,根据写入的数据得出判断是否为正数还是负数,输入数字为0时跳出循环,如果输入的数不为0,则进行相加(注:应该是一边输入一边相加)用sum表示相加的结果,如果判断为正数时,p++(p代表的是输入正数的数目),如果判断为负数时n++(n代表的是输入负数的数目),最后求所有数的平均值则是用sum/(p+n)
注:使用while(true){
}
具有一定的风险,必须在合适的时机使用break跳出循环
import java.util.*;
class test11{
public static void main(String[] args){
Scanner s=new Scanner(System.in);
double sum=0;
int p=0;//正数的个数
int n=0;//负数的个数
System.out.print("请输入若干数字");
while(true){
int num=s.nextInt();
if(num!=0){
sum+=num;//等同于 sum=sum+num;
if(num>0){
p++;
}else{
n++;
}
}else{
break;//跳出当前循环
}
}
if(p+n==0){
System.out.println("除了0没有其他数字的输入");
}else{
System.out.println("正数的个数"+p);
System.out.println("负数的个数"+n);
System.out.println("总数"+sum);
System.out.println("平均数"+sum/(p+n));
}
}
}
分析题目:要算出两个数(n1,n2)的最大公约数,首先应该将n1,n2两个数中小的数的所有约数都表示出来,将所有的约数从最大的数开始输出,然后用大的数去整除第一个数的约数,若出现其余数为0的情况下,则说明这个数就是n1,n2的最大公约数,然后将这个数赋值给gcd,然后用break跳出循环,输出gcd。
import java.util.*;
class test12{
public static void main(String[] args){
Scanner s=new Scanner(System.in);
System.out.print("输入两个数");
int n1=s.nextInt();
int n2=s.nextInt();
int gcd=1;
for(int i=n1<n2?n1:n2;i>=1;i--){//先写出n1,n2两个数中最小数的所有因数,然后依次排列,从最大值依次往前算
if(n1%i==0&&n2%i==0){
gcd=i;
break;
}
}
System.out.println(gcd);
}
}
题目分析:根据题目要求输入一个数,以升序的方式显示它的所有最小因子
用题目中给定的120 进行分析,它输出的最小因子的升序顺序是2,2,2,3,5。
120 2->120 2
60 2->60 2
30 2->30 2
15 2->15 3
5 2->5 5
1
有上述分析可得,当最后的值变为1时跳出循环,。。。使用while(true){}先进入到循环,当i=2时是for循环的初始条件,循环条件是,当i<num时一直循环,当i=num时循环停止,因此循环条件是i<=num,当num%i==0时输出i,然后将num/i赋值给num在进行循环,一直到num=1时跳出循环
import java.util.*;
class test13{
public static void main(String[] args){
Scanner s=new Scanner(System.in);
System.out.print("请输入一个数");
int num=s.nextInt();
while(true){
for(int i=2;i<=num;i++){
if(num%i==0){
System.out.print(i+" ");
num=num/i;
break;
}
}
if(num==1){
break;
}
}
}
}
题目分析:
素数:除了1和其本身以外没有其他因数的数称为素数
首先先用一个boolean类型的flag作为标记,假设开始输入的就为素数,当flag=flase时用break跳出循环,当循环是for进行完毕的话则说明是素数,如果是break出来的则不是素数
class test17{
public static void main(String[] args){
int count=0;
boolean flag=true;//定义一个boolean类型的flag(作为标记) boolean flag=true--假设开始输入的数为素数
for(int num=2;num<=1000;num++){
for(int m=2;m<=num-1;m++){
if(num%m==0){
flag=false;
break;
}
}
if(flag){
count++;
System.out.print(num+" ");
if(count%8==0){
System.out.println();
}
}
flag=true;
}
}
}
题目分析:由上述题目可得,我们可以发现括号内数字的分子都为1且分母是2*i-1
又发现当数字次序为偶数次序是为减,我们可以定义一个double类型的flag=1,然后将-flag赋给flog即可
import java.util.*;
class test18{
public static void main(String[] arge){
Scanner s=new Scanner(System.in);
System.out.print("请输入一个数字:");
int imax=s.nextInt();
double sum=0;//最后之和
double flag=1;
for(int i=1;i<=imax;i++){
sum+=flag/(2*i-1);
flag=-flag;
}
double pi=sum*4;
System.out.println(pi);
}
}
题目分析:这道题目需要注意的是:闰年的条件是什么?--1.可以整除4且不可以整除100;2.可以整除400
class test20{
public static void main(String[] args){
int count=0;
for(int i=101;i<=2100;i++){
if(i%4==0&&i%100!=0||i%400==0){
count++;
System.out.print(i+" ");
if(count%10==0){
System.out.println();
}
}
}
System.out.println("\n闰年一共"+count+"个");
}
}
题目分析:我们一般将十进制化为二进制时所用的方法时不断将2短除,将余数从下往上写即可
二进制字符串的反取: binStr=num%2+binStr;
import java.util.*;
class test23{
public static void main(String[] args){
Scanner s=new Scanner(System.in);
System.out.print("请输入一个数字");
int num=s.nextInt();
String binStr="";
while(true){
binStr=num%2+binStr;
num/=2;
if(num==0){
break;
}
}
System.out.println(binStr);
}
}
题目分析:当输入0时跳出循环,先让最大数为0,依次输入新数,当它>最大数时,将这个数列为最大数,若它<最大数时,此时原最大数还是现在的最大数
import java.util.*;
class test24{
public static void main(String[] args){
Scanner s=new Scanner(System.in);
int num=0;
int max=0;
int count=0;
System.out.print("请输入数字:");
while(true){
num=s.nextInt();
if(num==0){
break;
}else if(num>max){
max=num;
count=1;
}else if(num==max){
count++;
}
}
System.out.println("max="+max+",count="+count);
}
}