Fork me on GitHub

Java经典逻辑编程四

有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.Arrays;
import java.util.Scanner;
public class class_name {
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.println("请输入总人数。");
int num = in.nextInt();
boolean[] man = new boolean[num];
for(int i = 0; i < man.length; i++)
{
man[i] = true;
}
int t = 0, len = man.length;
while(len > 1)
{
for(int i = 0; i < man.length; i++)
{
if(man[i])
{
t++;
if(t == 3)
{
t = 0; //重置
man[i] = false; //去掉此人
len--; //人数减 1
}
}
}
}
System.out.println("最后的情况:" + Arrays.toString(man));//返回指定数组的字符串表示形式
for(int i = 0; i < man.length; i++)
{
if(man[i]) //最后留下来的人没有被flase
{
System.out.println("原来剩下的数:" + (i + 1)); //i + 1 是因为数组从 0 开始
}
}
}
}

写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Scanner;
public class class_name {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = in.next();
int len = lenOfstr(str);
System.out.println(str + " 的长度为 " + len);
}
private static int lenOfstr(String str) {
// TODO Auto-generated method stub
return str.length();
}
}

编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n(利用指针函数)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.Scanner;
public class class_name {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入一个整数");
int n = in.nextInt();
if(n % 2 == 0)
System.out.println("1/2 + 1/4 + ... + 1/"+ n+ "= " + evenSum(n));
else
System.out.println("1 + 1/3 + ... + 1/"+ n+ "= " + oddSum(n));
}
private static float oddSum(int n) {
// TODO Auto-generated method stub
float sum = 0.0f; //记得用 float 或 double 型
for(float i = 1.0f; i <= n;) { // i 用 int 就会把结果也强转为 int
sum += 1 / i;
i += 2;
}
return sum;
}
private static float evenSum(int n) {
// TODO Auto-generated method stub
float sum = 0.0f;
for(float i = 2.0f; i <= n;) {
sum += 1 / i;
i += 2;
}
return sum;
}
}

字符串排序。

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Arrays;
public class class_name {
public static void main(String[] args) {
String[] strs = {"abfds1", "advesd2", "dasfdsa3", "cdsaew1", "abbdsa2", "abbdsa"};
//直接用了 java 里有的 sort 方法
Arrays.sort(strs);
for(String str : strs) {
System.out.println(str);
}
}
}

海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class class_name {
public static void main(String[] args)
{
int num = 6; //分五份多一个,至少6个
while( true)
{
if(func(num))
{
break; //找到答案,跳出循环
}
num++;
}
System.out.println("符合要求的最小数是:" + num);
}
//判断这个数是否能被分5次
static boolean func(long n)
{
int i = 0; //被分次数0-4共5次
while(i < 5 && n > 0)
{
if((n - 1) % 5 == 0)
{
long temp = (n - 1) / 5 + 1;
n -= temp; //减去被一只猴子拿走和丢掉的
i ++;
}
else
return false;
}
return true;
}
}

法二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class class_name {
public static void main(String[] args)
{
int i= 0, m= 1, x= 1;
while(true)
{
m= x;
for(i= 0; i< 5; i++) {
if((m- 1)% 5== 0) {
m= (m- 1)/ 5* 4;
//System.out.println(m);
}else {
break;
}
}
if (i== 5 && m> 0) {
break;
}
x++;
System.out.println(x);
}
System.out.println("符合要求的最小数是:" + x);
}
}

809*??=800*??+9*??+1

其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class class_name{
public static void main(String[] args) {
int number = 0;
boolean flag = false;
for (int i=10; i<100; i++) {
if(809*i == (800*i+9*i)) {
if(((8* i)> 10)&& ((8* i) < 100)&& ((9* i) > 99)&& ((9* i)< 1000)) {
flag = true;
number = i;
}
}
}
if (flag) {
System.out.println("??是: "+ number);
System.out.println("809*"+number+"="+(809*number));
}else {
System.out.println("无符合要求的数!");
}
}
}

求0—7所能组成的奇数个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class class_name {
public static void main(String[] args) {
long total = 0L;
//可以把 76543210 变成 10 或 100 来检查该代码输出结果的正确性
for(int i = 0; i <= 76543210; i++){
if(i % 2 == 0) {
continue;
}
//把其中含有 8 和 9 的数去掉
if((i + "").indexOf("8") != -1 || (i + "").indexOf("9") != -1){
continue;
}
total++;
// System.out.println(i + " "); //输入每一个奇数
}
System.out.println("共有 " + total + "个奇数");
}
}

一个偶数总能表示为两个素数之和。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.Scanner;
public class class_name {
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.println("请输入一个大于等于4偶数。");
int num = in.nextInt();
if(num < 4)
System.out.println("输入错误!");
if(num % 2 == 0)
{
int i , j;
for(i = 2; i <= num /2; i++)
{
if(isPrime(i))
{
j = num - i;
if(isPrime(j))
System.out.println(num + " = " + i + " + " + j);
}
}
}
}
public static boolean isPrime(int k)
{
for(int i = 2; i < Math.sqrt(k); i++)
{
if(k % i == 0)
return false;
}
return true;
}
}

读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.Random;
public class class_name {
public static void main(String[] args)
{
Random rm = new Random();
for(int n = 0; n < 7; n++)
{
int i = rm.nextInt(50); //50以内的随机数
System.out.print(i + " : ");
for(int m = 0; m < i; m++)
{
System.out.print("*");
}
System.out.println();
}
}
}

某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.Scanner;
public class class_name {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入一个四位整数");
int num = in.nextInt();
System.out.println("加密后数据为:" + encrypt(num));
}
private static int encrypt(int num) {
// TODO Auto-generated method stub
int a, b, c, d; //从左到右分别为第一到第四位
//分解
a = num / 1000;
b = (num / 100) % 10;
c = (num / 10) % 10;
d = num % 10;
//取余
a = (a + 5) % 10;
b = (b + 5) % 10;
c = (c + 5) % 10;
d = (d + 5) % 10;
//交换,其实这里只要换一下重组会整数的顺序就行了
num = d *1000 + c * 100 + b * 10 + a;
return num;
}
}

计算字符串中子串出现的次数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class class_name {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入一个字符串");
String sen = in.next();
System.out.println("请输入要查找的子字符串");
String str = in.next();
/* //一般方法
int count = 0;
int start = 0;
while (sen.indexOf(str, start) >= 0 && start < sen.length()) {
count++;
start = sen.indexOf(str, start) + str.length();
}*/
//正则表达式 第二个参数为忽略大小写
Pattern p = Pattern.compile(str, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(sen);
int count = 0;
while(m.find()){
count ++;
}
System.out.println(str + "在" + sen + "出现的次数为" + count);
}
}

有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件”stud”中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.Scanner;
public class class_name {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[][] stu = new String[2][6]; //为了快速测试,5个同学变成了2个同学
for(int i = 0; i < 2; i++){
System.out.printf("请输入第%d个学生的姓名", i + 1);
stu[i][0] = in.next();
System.out.printf("请输入第%d个学生第学号", i + 1);
stu[i][1] = in.next();
for(int j = 2; j < 5; j++){
System.out.printf("请输入该同学的第%d门课程成绩", j - 1);
stu[i][j] = in.next();
}
}
for(int i = 0; i < 2; i++){
int sum = 0;
for(int j = 2; j < 5; j++){
sum += Integer.parseInt(stu[i][j]);
}
stu[i][5] = Float.toString((float)sum / 3);
}
String s;
try{
File file = new File("E:/home/stu"); //要存放的路径
if(file.exists()){
System.out.println("文件存在");
}
else{
System.out.println("文件不存在,正在创建....");
file.createNewFile();
}
BufferedWriter output = new BufferedWriter(new FileWriter(file));
for(int i = 0; i < 2; i++){
for(int j = 0; j < 6; j++){
s = stu[i][j] + "\r\t";
output.write(s);
// System.out.print(stu[i][j]); //被注释的这三行用来格式化输出到控制台(屏幕)
// System.out.printf("\t", "");
}
// System.out.println();
}
output.close();
System.out.println("数据已写入");
}catch(Exception e){
e.printStackTrace();
}
}
}
Your support will encourage me to continue to create!