Demo 32
本题主要解决随机数问题以及随机数与输入数字的比较问题。随机数则需要调用一个随机函数Random来实现,具体的函数格式为(其中101代表的是随机数产生的范围):
`Random random = new Random();
int sum = random.nextInt(101);`、
在进行比较时,用户每输入一个数,就要与产生的随机数进行比较,这边则用循环的方式进行,具体的代码实现如下:
import java.util.*;
public class Demo32{
public static void main(String[] args){
Random random = new Random();
int sum = random.nextInt(101);
Scanner input = new Scanner(System.in);
while(true){
System.out.print("请输入一个数字:");
int num1 = input.nextInt();
if(num1 == sum){
System.out.println("猜对了!");
break;
}else if(num1 < sum){
System.out.println("猜小了!");
}else{
System.out.println("猜大了!");
}
}
}
}
Demo 33
求两数的最大公约数,则需要找到两数除一之外最大的且相等的约数。如题中所提示的将两数分别设为n1和n2,将i设为其公约数,并检测是否为最大公约数且k不得大于n1或者n2,由题可知最大公约数可能与其中较小的数相等,故可先令k等于两数中较小的数,在进行递减,递减则可使用循环,if语句则是用来判断是否为两数的约数,具体代码实现如下:
import java.util.*;
public class Demo33{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("请输入数字:");
int num1 = input.nextInt();
System.out.print("请输入数字:");
int num2 = input.nextInt();
int min = num1 < num2 ? num1 : num2;
for(int i = min ;i>=1;i--){
if (num1 % i == 0&&num2%i==0){
System.out.print(i);
break;
}
}
}
}
Demo 34
本题涉及的是十进制转换问题,将十进制数转换为十六进制。方法则可是对输入的十进制数取余,因为十六进制数涉及字母,所以得引进字符串,字符串的引入则可使用以下语句:
String hex = "";
将十进制数对十六取余记为g,每取余将g赋值给字符串hex,因为十六进制字符向前加,则可写为hex=g+hex,需要使用循环和选择语句,代码显示如下:
import java.util.*;
public class Demo34{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("输入一个数:");
int num = input.nextInt();
String hex = "";
while(num!=0){
int g = num % 16;
if(g<10){
hex=g+hex;
}else{
hex=(char)(g-10+65)+hex;
}
num/=16;
}
System.out.println(hex);
}
}
Demo 36
本题要求所写代码要解决是否为素数问题, 素数是他的正因子只有一和其本身的数,在循环语句中判断循环是否正常结束时,可以用flag来判断。在判断是否为素数时,设i为因子,从i = 2 开始判断,直到 i 等于需要判断的数本身,若可以整除,则跳出循环,进行下一个数的判断。因为题中要求前50的素数需要按照每行打印10个的规则进行,所以就得对判断出来的素数进行计数,并对其进行10的整除,具体代码如下:
public class Demo36 {
public static void main(String[] args) {
int number = 2;
int count = 0;
while (count < 50) {
boolean flag = true;//表示循环是正常结束
for (int i = 2; i <= number - 1; i++) {
if (number % i == 0) {
flag = false;
break;
}
}
if (flag) {
System.out.print(number + "\t");
count++;
if (count % 10 == 0) {
System.out.println();
}
}
number++;
}
}
}
Demo 37
本题要求统计正数和负数的个数并计算这些数的平均值,对不确定个数的整数进行判断,因为循环不确定循环的步长,故使用while循环,对任何数都可进行循环,在循环体中进行正负数的判断,并对其进行计数同时进行求和,具体代码实现如下所示:
import java.util.*;
public class Demo37{
public static void main(String[] args) {
int positives=0,negatives=0;
double total=0;
Scanner input = new Scanner(System.in);
System.out.print("请输入数字:");
while(true){
int num = input.nextInt();
if(num>0){
positives++;
}else if(num<0){
negatives++;
}else{
break;
}
total+=num;
}
if (negatives+positives==0){
System.out.println("No numbers!");
}else{
double averange=total/(positives+negatives);
System.out.println("averange = " + averange);
}
}
}
Demo 38
本题要求找出100到1000之间既能被5整除又能被6整除的数,因为每行只能显示10个数,因此要对满足要求的数进行计数,并将其总数对十取余,同时打印输出,代码实现如下:
public class Demo38{
public static void main(String[] args){
int count = 0;
for(int i=100;i<=1000;i++){
if(i % 5 == 0 && i % 6 == 0){
System.out.print(i+"\t");
count++;
if(count % 10 == 0){
System.out.println();
}
}
}
}
}
Demo 39
因为本题要找出100到200之间能被5或6整除,但不能被两者同时整除的数,满足异或关系,判断步骤与Demo 38一致,代码如下:
public class Demo39{
public static void main(String[] args){
int count = 0;
for(int i=100;i<=200;i++){
if(i % 5 == 0 ^ i % 6 == 0){
System.out.print(i + "\t");
count++;
if(count % 10 == 0){
System.out.println();
}
}
}
}
}
Demo 40
因为要找出最小因子,则循环从i = 2 开始直到 i <= num(输入的整数)结束,先判断i是否为其因子,在求出整除2的数,继续判断,以此类推,直到 i 等于整数本身,代码如下:
import java.util.*;
public class Demo40{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("请输入数字:");
int num = input.nextInt();
while(num != 1){
for(int i=2;i<=num;i++){
if(num%i == 0){
System.out.print(i+" ");
num = num / i;
break;
}
}
}
}
}
Demo 41
本题要求显示金字塔,以第四行为例,数字先递减在递增,满足绝对值函数。i为行数,外循环从 i = 1开始到 i <= line(最后输出的行数),k则代表金字塔前面的空格数,满足 k = line - 1,打印完空格后再打印数字,数字满足的绝对值函数如下图所示:
其具体代码如下所示:
import java.util.*;
public class Demo41 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入行数:");
int line = input.nextInt();
for(int i=1;i<=line;i++){
for(int k = 1;k<=line - i;k++){
System.out.print(" ");
}
for(int j = -(i-1);j<=i-1;j++){
int temp = Math.abs(j)+1;
System.out.printf("%d ",temp);
}
System.out.println();
}
}
}
Demo 42
图案一:按照行数的递增,输出的数跟着递增,主要代码如下:
for(int i = 1 ; i <= 6 ; i++){
for (int j = 1 ; j <= i ; j ++){
System.out.print(j + " ");
}
System.out.println();
}
System.out.println();
图案二:随着行数的递增,输出的数跟着递减,主要代码如下:
for(int i = 6 ; i >= 1; i--){
for(int j = 1 ; j <= i ; j++){
System.out.print(j + " ");
}
System.out.println();
}
System.out.println();
图案三:这个图形的输出可参照Demo 41 的图案输出,借鉴绝对值函数输出,代码如下:
for(int i = 1; i <= 6; i++){
for(int j = -5; j <= 0; j++){
if(Math.abs(j) >= i){
System.out.print(" ");
}else{
System.out.print((Math.abs(j) + 1) + " ");
}
}
System.out.println();
}
System.out.println();
图案四:先打印空格,在打印数字,数字的输出从一到六递增输出,代码如下:
for(int i = 0; i < 6; i++){
for(int j = 0; j < 6; j++){
if(j < i){
System.out.print(" ");
}else{
System.out.print((j + 1) + " ");
}
}
System.out.println();
}
Demo 43
数字的输出满足2的(i-1)次方,同时满足先递减在递增,满足绝对值函数,与Demo 41方法类似,具体的代码如下:
import java.util.*;
public class Demo43{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.print("输入行数:");
int line = in.nextInt();
for(int i = 1 ; i <= line ; i++){
for(int k = 1 ; k <= line - i ; k++){
System.out.print(" ");
}
for(int j = pow(2,( i - 1 )); j <= i ; j++){
}
}
}
}
Demo 45
先定义分子 n ,则分母满足 n + 2 ,并对其进行求和,代码如下:
public class Demo45{
public static void main(String[] args) {
double sum = 0;
// 分子
for( double n = 1 ; n <= 97 ; n = n + 2){
sum = sum + n / (n + 2);
}
System.out.println("sum = " + sum);
}
}
Demo 46
计算Π,定义一个sum 表示和,定义pi ,先令其等于4,最后进行pi与sum的乘积并赋值给pi,因为题中的数列加减交替进行,故可将其看作全进行加和,建立一个flag,令其等于1,每循环一次flag乘-1,则可达到题目中的效果,分子均为flag*n,n为次数,分母满足(2n - 1),则代码实现如下:
import java.util.*;
public class Demo46{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.print("请输入i值:");
double i = in.nextDouble();
double pi = 4 ;
double sum = 0 ;
double flag = 1 ;
for (double n = 1 ; n <= 2 * i - 1 ; n++){
sum = sum + flag / (2 * n - 1);
flag *= -1;
}
pi = pi * sum ;
System.out.println(pi);
}
}
Demo 47
分子均为一,分母则为上个分母的累积(阶乘),因为涉及分数,则选择的数据类型为double,e则为累加,代码如下:
public class Demo47 {
public static void main(String[] args) {
double e = 0;
double result = 1;
double sum = 0;
for (int i = 1; i <= 10; i++) {
result = result * i;
sum = sum + 1 / result;
}
sum++;
System.out.println(sum);
}
}
Demo 48
由题可知,完全数的最大除数是这个整数的一半,循环从1开始到整数的一半结束,对因子进行累加,直到加和与整数相等,代码如下:
public class Demo48{
public static void main(String[] args){
for( int num=1 ; num <=10000 ; num++){
int sum = 0;
for (int i = 1 ; i <= num / 2 ; i++){
if(num %i == 0){
sum += i;
}
}
if(num == sum ){
System.out.println(num);
}
}
}
}
Demo 49
定义一个字符串数组arr[]={“剪刀”,“石头”,“布”},数组中 0-剪刀 ,1-石头 ,2-布,并且要建立一个随机的函数,代表计算机,用户随机输入,用选择语句来判断,循环的结束条件为用户或者计算机赢对手两次,故需要使用嵌套语句来实现,具体代码如下:
import java.util.*;
public class Demo49 {
public static void main(String[] args) {
//随机产生电脑的结果
Random random = new Random();
int com = random.nextInt(3);//[0,3)
//用户输入
Scanner input = new Scanner(System.in);
int usrWin = 0;
int comWin = 0;
/*
只考虑用户赢的情况
usr com
0 2 0 - 2 = -2
1 0 1 - 0 = 1
2 1 2 - 1 = 1
只考虑电脑赢的情况
usr com
2 0 2 - 0 = 2
0 1 0 - 1 = -1
1 2 1 - 2 = -1
*/
while(true){
System.out.print("请输入 0-剪刀 1-石头 2-布:");
int usr = input.nextInt();
String[] arr = {"剪刀","石头","布"};
if (usr == com) {
//和局
System.out.printf("和局!用户是%s,电脑是%s",arr[usr],arr[com]);
}else if (usr - com == -2 || usr - com == 1) {
//用户赢
usrWin++;
System.out.printf("用户赢!用户是%s,电脑是%s",arr[usr],arr[com]);
} else{
//电脑赢
comWin++;
System.out.printf("电脑赢!用户是%s,电脑是%s",arr[usr],arr[com]);
}
if(usrWin == 2){
System.out.print("用户胜!");
break;
}else if(comWin == 2){
System.out.print("电脑胜!");
break;
}
}
}
}
usrWin++;
System.out.printf("用户赢!用户是%s,电脑是%s",arr[usr],arr[com]);
} else{
//电脑赢
comWin++;
System.out.printf("电脑赢!用户是%s,电脑是%s",arr[usr],arr[com]);
}
if(usrWin == 2){
System.out.print("用户胜!");
break;
}else if(comWin == 2){
System.out.print("电脑胜!");
break;
}
}
}
}