JAVA经典算法50题(5)【面试+工作】
【程序41】 题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
本题源码:
public class Demo41 {
static int ts = 0;// 桃子总数
int fs = 1;// 记录分的次数
static int hs = 5;// 猴子数
int tsscope = 5000;// 桃子数的取值范围,太大容易溢出。
public int fT(int t) {
if (t == tsscope) {
// 当桃子数到了最大的取值范围时取消递归
System.out.println("结束");
return 0;
} else {
if ((t - 1) % hs == 0 && fs <= hs) {
if (fs == hs) {
System.out.println("桃子数=" + ts + "时满足分桃条件");
}
fs += 1;
return fT((t - 1) / 5 * 4);// 返回猴子拿走一份后的剩下的总数
} else {
// 没满足条件
fs = 1;// 分的次数重置为1
return fT(ts += 1);// 桃子数加+1
}
}
}
public static void main(String[] args) {
new Demo41().fT(0);
}
}
个人修改:
public class Demo41 {
public static void main(String[] args) {
int sum = 0;
for (int i = 6;; i++) {// 最少6个分最后一次
sum = i;// 桃子数
for (int j = 0; j < 5; j++) {// 分的次数循环
if ((sum - 1) % 5 == 0 && j < 5) {// 如果扔一个后能均分5份,继续分
sum = (sum - 1) / 5 * 4;// 每分一次剩余桃子数
if (j == 4) {// 如果已分5次,且仍能除尽,输出,退出程序
System.out.println(i);
System.exit(0);
}
}
}
}
}
}
【程序42】 题目:809*??=800*??+9*??+1。其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
(本题为无解,去掉1有解)
public class Demo42 {
public static void main(String[] args) {
for (int i = 10; i < 100; i++) {
if (809 * i == (800 * i + 9 * i + 1) && 8 * i >= 10 && 8 * i < 100
&& 9 * i >= 100 && 9 * i < 1000) {
System.out.println("?? =" + i);
System.out.println("809*??="+ 809 * i);
System.exit(0);
}
}
}
}
【程序43】 题目:求0—7所能组成的奇数个数。
暴力算法:
public class Demo43 {
public static boolean isJiShu(int n) {
if (n % 2 != 0) {
return true;
} else {
return false;
}
}
public static boolean fun(char c) {
if (c >= '0' && c <= '7') {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
int count = 0;
String s;
for (int i = 0; i < 100000000; i++) {
s = "" + i;
boolean flag = true;
char[] c = s.toCharArray();
for (int j = 0; j < c.length; j++) {
if (!fun(c[j])) {
flag = false;
break;
}
}
if (flag && isJiShu(i)) {
count++;
}
s = "";
}
System.out.println("共" + count + "个。");
}
}
数学算法:
public class Demo43 {
public static void main(String[] args) {
// 因为是奇数,所以个位只能是1,3,5,7共4种,前面可随便排列
int count = 4;// 个位的4种
// 2位时,十位有8种,个位4种,8×4
// 3位时,8×8×4……
for (int i = 1; i < 8; i++) {
count = 8 * count;
System.out.println("count:" + count);
}
}
}
个人算法:
//组成1位数是4个。
//组成2位数是7*4个。
//组成3位数是7*8*4个。
//组成4位数是7*8*8*4个。
//......
public class Demo43 {
public static void main (String[] args) {
int sum=4;
int j;
System.out.println("组成1位数是 "+sum+" 个");
sum=sum*7;
System.out.println("组成2位数是 "+sum+" 个");
for(j=3;j<=9;j++){
sum=sum*8;
System.out.println("组成"+j+"位数是 "+sum+" 个");
}
}
}
【程序44】 题目:一个偶数总能表示为两个素数之和。(注:哥德巴赫猜想是想证明对任何大于6的自然数n之内的所有偶数可以表示为两个素数之和)
public class Demo44 {
public static boolean isSuShu(int x) {
if (x == 0 || x == 1) {
return false;
}
for (int i = 2; i <= Math.sqrt(x); i++) {
if (x % i == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
// 求了下100以内的情况
for (int i = 0; i < 100; i = i + 2) {
for (int j = 0; j <= (i + 1) / 2; j++) {
if (isSuShu(j) && isSuShu(i - j)) {
System.out.println(i + "=" + j + "+" + (i - j));
}
}
}
}
}
或
public class Demo44{
public static void main(String[] args){
for (int i=6;i<=100 ;i+=2 ){
for (int j=2;j<100 ;j++ ){
if(!isPrime(j)||!isPrime(i-j)||j>=i)
continue;
System.out.println(i+"="+j+"+"+(i-j));
break;
}
}
}
public static boolean isPrime(int n){
for (int i=2;i<n ;i++ ){
if(n%i==0)return false;
}
return true;
}
}
【程序45】 题目:(1)判断几个9能被一个素数整除。(2)判断一个整数能被几个9整除。(原题:一个素数能被几个9整除)
(一)
public class Demo45 {
public static boolean isSuShu(int x) {
if (x == 0 || x == 1) {
return false;
}
for (int i = 2; i <= Math.sqrt(x); i++) {
if (x % i == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
int[] a = new int[100];
int n = 0;
int num = 0;
// 长度100的素数数组
while (n < 100) {
if (isSuShu(num)) {
a[n] = num;
n++;
num++;
} else {
num++;
}
}
/* for (int t : a) {
System.out.println(t);
}*/
String s = "9";
int index = 0;
while (s.length() < 9) {
if (new Integer(s).intValue() % a[index] == 0) {
System.out.println(s + "%" + a[index] + "=0");
if (index < 100 - 1) {
index++;
} else {
index = 0;
s = s + "9";
}
// System.exit(0);
} else {
if (index < 100 - 1) {
index++;
} else {
index = 0;
s = s + "9";
}
}
}
}
}
(二)
import java.util.*; public class Demo45 {
public static void main (String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num = in.nextInt();
int tmp = num;
int count = 0;
for(int i = 0 ; tmp%9 == 0 ;){
tmp = tmp/9;
count ++;
}
System.out.println(num+" 能够被 "+count+" 个9 整除。");
}
}
【程序46】 题目:两个字符串连接程序。
import java.util.Scanner;
public class Demo46 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("输入第一个字符串:");
String s1 = in.next();
System.out.println("输入第一个字符串:");
String s2 = in.next();
System.out.println("连接后:\n" + s1 + s2);
}
}
或
import java.util.*;
public class Demo46 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入一个字符串:");
String str1 = in.nextLine();
System.out.print("请再输入一个字符串:");
String str2 = in.nextLine();
String str = str1+str2;
System.out.println("连接后的字符串是:"+str);
}
}
【程序47】 题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的。
import java.util.*;
public class Demo47 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n=1,num;
while(n<=7){
do{
System.out.print("请输入一个1--50 之间的整数:");
num= s.nextInt();
}while(num<1||num>50);
for(int i=1;i<=num;i++)
{System.out.print("*");
}
System.out.println();
n ++;
}
}
}
或
import java.util.Scanner;
public class Demo47 {
public static void print(int n) {
for (int i = 0; i < n; i++) {
System.out.print("*");
}
System.out.println();
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
for (int i = 0; i < 7; i++) {
int temp = in.nextInt();
print(temp);
}
}
}
【程序48】 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
import java.util.Scanner;
public class Demo48{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入一个4位数字:");
String str = in.next();
if (!((str).matches("\\d{4}"))) {
System.out.println("输入的不是4位数字!");
System.exit(0);
}
char[] c = str.toCharArray();
int[] a = new int[4];
for (int i = 0; i < a.length; i++) {
a[i] = ((int) (c[i] - '0') + 5) % 10;
}
int t;
t = a[0];
a[0] = a[3];
a[3] = t;
t = a[1];
a[1] = a[2];
a[2] = t;
System.out.println("结果是:" + a[0] + a[1] + a[2] + a[3]);
}
}
或
import java.util.*;
public class Demo48 {
public static void main(String args[]) {
Scanner s = new Scanner(System.in);
int num=0,temp;
do{
System.out.print("请输入一个4位正整数:");
num = s.nextInt();
}while (num<1000||num>9999);
int a[]=new int[4];
a[0] = num/1000; //取千位的数字
a[1] = (num/100)%10; //取百位的数字
a[2] = (num/10)%10; //取十位的数字
a[3] = num%10; //取个位的数字
for(int j=0;j<4;j++) {
a[j]+=5; a[j]%=10;
}
for(int j=0;j<=1;j++) {
temp = a[j]; a[j] = a[3-j]; a[3-j] =temp;
}
System.out.print("加密后的数字为:");
for(int j=0;j<4;j++) System.out.print(a[j]);
}
}
【程序49】 题目:计算字符串中子串出现的次数。
import java.util.Scanner;
public class Demo49 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.println("请输入主串:");
String str1 = in.nextLine();
System.out.println("请输入子串:");
String str2 = in.nextLine();
// 生成子串长度的N个字符串数组
String[] sa = new String[str1.length() - str2.length() + 1];
for (int i = 0; i < sa.length; i++) {
sa[i] = str1.substring(i, i + str2.length());
}
int sum = 0;
// 子串与N个拆开的子串比对
for (int i = 0; i < sa.length; i++) {
if (sa[i].equals(str2)) {
// 成功配对,计数器+1;
sum++;
// 因为不计算重叠的子串,所以跳过配对之后的部分拆分子串
i = i + str2.length();
}
}
System.out.println("主串中共包含" + sum + "个字串");
}
}
【程序50】 题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,把原有的数据和计算出的平均分数存放在磁盘文import java.io.File;
import java.io.FileWriter;
import java.util.Scanner;
class Student {
private int number = 0;
private String name = "";
private double[] a = new double[3];
public double getAve() {
return (a[0] + a[1] + a[2]) / 3;
}
public Student(int number, String name, double[] a) {
super();
this.number = number;
this.name = name;
this.a = a;
}
@Override
public String toString() {
return "学号:" + this.number + "\t姓名:" + this.name + "\r\n各科成绩:\r\n" + a[0] + "\t" + a[1] + "\t" + a[2] + "\r\n平均成绩:\r\n"
+ this.getAve();
}
}
public class Demo50 {
public static Student input() {
Scanner s = new Scanner(System.in);
System.out.println("请输入学号:");
int num = s.nextInt();
System.out.println("请输入姓名:");
String name = s.next();
System.out.println("请分别输入3门成绩:");
double[] a = new double[3];
for (int i = 0; i < 3; i++) {
a[i] = s.nextDouble();
}
return new Student(num, name, a);
}
public static void main(String[] args) throws Exception {
Student[] st = new Student[2];
for (int i = 0; i < st.length; i++) {
st[i] = input();
}
File f = new File("d:" + File.separator + "123.txt");
FileWriter output = new FileWriter(f);
for (int i = 0; i < st.length; i++) {
output.write(st[i].toString() + "\r\n");
output.write("\r\n");
}
output.close();
}
}