题一:
/**
* 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,
* 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少对?
* 分析:
* 第一个月:1对
* 第二个月:1对
* 第三个月:2对
* 第四个月:3对
* 第五个月:5对
* 第六个月:8对
* ...
* 第n个月:n>2时,f(n)=f(n-1)+f(n-2),即满足斐波那契数列
*/
public class Arithmetic01 {
public static void main(String[] args) {
for (int n = 1; n <= 12; n++){
System.out.println(f(n));
}
}
public static int f(int n) {
if (n == 1 || n == 2){
return 1;
}
return f(n - 1) + f(n - 2);
}
}
题二:
/**
* 题目:判断101-200之间有多少个素数,并输出所有素数。
* 分析:
* 所谓素数(也称质数),是指除了自己和它本身外没有其他的约数。
*/
public class Arithmetic02 {
public static void main(String[] args) {
boolean isPrime = false;
System.out.println("101-200之间的素数有:");
for(int i=101;i<=200;i+=2){//i+=2是为了提高效率,因为毕竟偶数不会是素数
for(int j=2;j<=Math.sqrt(i);j++){
if(i%j==0){
isPrime = false;
break;
}
isPrime = true;
}
if(isPrime){
System.out.println(i);
}
}
}
}
题目三:
/**
* 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。
* 例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
* 分析:
* 既然是三位数,那么范围必定可缩小为100~999
*/
public class Arithmetic03 {
public static void main(String[] args) {
System.out.println("所有的水仙花数是:");
for(int i=100;i<=999;i++){
int g = i%10;//个位
int s = i/10%10;//十位
int b = i/100;//百位
if(i== g*g*g+s*s*s+b*b*b){
System.out.println(i);
}
}
}
}
题目四:
/**
* 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
* 分析:
* 对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
* (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
* (2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你,重复执行第一步。
* (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
*/
public class Arithmetic04 {
public static void main(String[] args) {
String str = "";
Arithmetic04 c = new Arithmetic04();
str = javax.swing.JOptionPane.showInputDialog("请输入N的值(输入exit退出):");
int N = 0;
try {
N = Integer.parseInt(str);
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.print(N + "分解质因数:" + N + "=");
c.resolve(N);
}
public void resolve(int n) {
for (int i = 2; i <= n / 2; i++) {
if (n % i == 0) {
System.out.print(i + "*");
resolve(n / i);
}
}
System.out.print(n);
System.exit(0);// /不能少这句,否则结果会出错
}
}
题目五:
/**
* 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,
* 60-89分之间的用B表示,60分以下的用C表示
* 分析:
* 本题目的重点在于利用条件运算符
*/
public class Arithmetic05 {
public static void main(String[] args) {
System.out.println(getGrade(59));
}
public static String getGrade(int score){
return score>=90?"A":(score<60?"C":"B");
}
}
题目六:
import java.util.Scanner;
/**
* 题目:输入两个正整数m和n,求其最大公约数和最小公倍数 分析:
* 分析:
* 1.利用辗除法求出最大公约数
* 2.清楚概念:a,b的最小公倍数=a*b/(a,b的最大公约数)
*/
public class Arithmetic06 {
// 下面的方法是求出最大公约数
public static int gcd(int m, int n) {
while (true) {
if ((m = m % n) == 0)
return n;
if ((n = n % m) == 0)
return m;
}
}
public static void main(String args[]) throws Exception {
// 取得输入值
Scanner chin = new Scanner(System.in);
int a = chin.nextInt();
int b = chin.nextInt();
int c = gcd(a, b);
System.out.println("最小公倍数:" + a * b / c + "\n最大公约数:" + c);
}
}
题目七:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
* 例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
* 分析:
* 解一,利用字符串相加构造,例如:3,"3"+"3"构造成33,,,
* 解二,利用循环构造个十百,,,位
*/
public class Arithmetic07 {
// 解一,
// public static void main(String[] args) throws IOException {
// int s = 0;
// String output = "";
// BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in));
// System.out.println("请输入a的值");
// String input = stadin.readLine();
// for (int i = 1; i <= Integer.parseInt(input); i++) {
// output += input;
// int a = Integer.parseInt(output);
// s += a;
// }
// System.out.println(s);
// }
// 解二,
public static void main(String[] args) throws IOException {
int s = 0;
int n = 0;
int t = 0;
BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in));
String input = stadin.readLine();
n = Integer.parseInt(input);
for (int i = 1; i <= n; i++) {
t = t * 10 + n;
s= s + t;
}
System.out.println(s);
}
}
题目八:
/**
* 题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。
* 例如6=1+2+3.编程找出1000以内的所有完数。
* 分析:
*/
public class Arithmetic08 {
public static void main(String[] args) {
int s;
for (int i = 1; i <= 1000; i++) {
s = 0;
for (int j = 1; j <= i/2; j++) {
if (i % j == 0) {
s = s + j;
}
}
if (s == i) {
System.out.print(i + " ");
}
}
}
}
题目九:
/**
* 一球从100米高度*落下,每次落地后反跳回原高度的一半;
* 再落下,求它在第10次落地弹起到最高点时,共经过多少米?第10次反弹多高?
* 分析:
* 1.先分析反弹高度,为hign(n)=100/Math.pow(2,n)
* 2.经过总路线长度sum
* 第一次:f(1)=100+50=100+high(1)
* 第二次:f(2)=100+50+50+25=f(1)+high(1)+high(2)
* 第三次:f(3)=100+50+50+25+25+12.5=f(2)+high(2)+high(3)
* ......
* 第n次:f(n)=f(n-1)+high(n-1)+high(n);
*/
public class Arithmetic09 {
public static void main(String[] args) {
int count=10;
System.out.println("它在第"+count+"次落地弹起到最高点时,共经过"+f(count)+"米," +
"第"+count+"次反弹"+high(count)+"高");
}
public static double high(int count){
return 100/Math.pow(2, count);
}
public static double f(int n){
if(n==1){
return 100+high(n);
}else{
return f(n-1)+high(n-1)+high(n);
}
}
}
题目十:
/**
* 一球从100米高度*落下,每次落地后反跳回原高度的一半;
* 再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
*/
public class Arithmetic10 {
public static void main(String[] args) {
double sum=0;
double high=100;
for(int i=1;i<=10;i++){
sum += high;
high /= 2;
}
System.out.println(sum);
System.out.println(high);
}
}
题目十一:
/**
* 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
* 分析:
* 先构造出所有的排序,再去掉重复的
*/
public class Arithmetic11 {
public static void main(String[] args) {
int i = 0;
int j = 0;
int k = 0;
int amount = 0;
for (i = 1; i <= 4; i++)//百位上的数字
for (j = 1; j <= 4; j++)//十位上的数字
for (k = 1; k <= 4; k++)//个位上的数字
if (i != j && j != k && i != k) {
amount += 1;
System.out.println(i * 100 + j * 10 + k);
}
System.out.println("总个数为:"+amount);
}
}
题目十二:
/**
* 题目:一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少?
* 分析:
* 要懂得什么是完全平方数概念:例如整数a,b,其中a=b*b,则a是完全平方数
*/
public class Arithmetic12 {
public static void main (String[]args){
for(int i=0;;i++){
if((Math.floor(Math.sqrt(i+100)) == Math.sqrt(i+100))
&& (Math.floor(Math.sqrt(i+168)) == Math.sqrt(i+168))){
System.out.println(i);
}
}
}
}
题目十三:
import java.util.Scanner;
/**
* 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时
* 北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas曾提及这个故事,据说创世
* 纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64
* 个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根
* 石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬 运完毕之时,此塔将毁损,而也就是世界末日来临之时。
*
* 分析: 如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,
* 当有两个盘子,就将B当作辅助柱。如果盘数超过2个,将第三个以下的盘子遮起来, 就很简单了,每次处理两个盘子,也就是:A->B、A
* ->C、B->C这三个步骤, 而被遮住的部份,其实就是进入程式的递回处理。 事实上,若有n个盘子,则移动完毕所需之次数为2^n - 1,
* 所以当盘数为64时,则64 如果对这数字没什么概念,就假设每秒钟搬一个盘子好了,也要约5850亿年左右。
*/
public class Arithmetic14 {
public static int count = 0;
public static void hanoi(int n, char A, char B, char C) {
if (n == 1) {
// 将这1个盘子从a搬到c
System.out.println("第" + (++count) + "次:金盘【" + n + "】:从【" + A + "】塔-->【" + C + "】塔!");
} else {
hanoi(n - 1, A, C, B);// 先将前n-1个盘子从a通过c搬到b
// 将第n个盘子从a搬到c System.out.println("第" + (++count) + "次:金盘【" + n + "】:从【" + A + "】塔-->【" + C + "】塔!");
hanoi(n - 1, B, A, C);// 再将这前n-1个盘子从b通过a搬到c
}
}
public static void main(String[] args) {
char A = 'A', B = 'B', C = 'C';
int n = 1;
System.out.print("请输入盘子数:");
Scanner num = new Scanner(System.in);
n = num.nextInt();
hanoi(n, A, B, C);
}
}
题目十四:
import java.util.Scanner;
/**
* 题目:输入某年某月某日,判断这一天是这一年的第几天?
* 分析:
* 本问题的重点在于要把每个月的天数构建成一个数组(重点考虑平闰年2月份的天数)
*/
public class Arithmetic13 {
int[] days = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
public void getResult() {
Scanner scan = new Scanner(System.in);
System.out.println("请输入年:");
int year = scan.nextInt();
System.out.println("请输入月:");
int month = scan.nextInt();
System.out.println("请输入日:");
int day = scan.nextInt();
int whichDay = 0; if (month > 1) {
for (int i = 0; i < month - 1; i++) {
whichDay = whichDay + days[i];
}
whichDay = whichDay + day;
if (month > 2 && isLeapYear(year)) {
whichDay = whichDay + 1;
}
}
else {
whichDay = day;
}
System.out.println("whichDay = " + whichDay);
}
public boolean isLeapYear(int year) {
boolean isLeap = false;
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
return true;
}
return isLeap;
}
public static void main(String[] args) {
(new Arithmetic13()).getResult();
}
}
题目十五:
/**
* 题目:输出9*9口诀。
*/
public class Arithmetic15 {
// 不出现重复的乘积(下三角)
// public static void main(String[] args) {
// for (int i = 1; i <= 9; i++) {
// for (int j = 1; j <= i; j++){
// System.out.print(j + "*" + i + "=" + i * j + "\t");
// }
// System.out.println();
// }
// }
// 上三角
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = i; j <= 9; j++) {
System.out.print(i + "*" + j + "=" + i * j + "\t");
}
System.out.println();
}
}
}
题目十六:
/**
* 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,
* 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
* 以后每天早上都吃了前一天剩下的一半零一个。
* 到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
*
* 分析:
* 采用逆向思维,(下一天+1)*2=当前天
*/
public class Arithmetic16 {
//day表示第几天
public static int total(int day){
if(day == 10){
return 1;
}else{
return (total(day+1)+1)*2;
}
}
public static void main(String[] args){
System.out.println(total(1));//第一天即表示总共有多少
}
}
题目十七:
/**
* 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
*/
public class Arithmetic19 {
public static void main(String[] args) {
float fm = 1f;
float fz = 1f;
float temp;
float sum = 0f;
for (int i = 0; i < 20; i++) {
temp = fm;
fm = fz;
fz = fz + temp;
sum += fz / fm;
}
System.out.println(sum);
}
}
题目十八:
/**
* 题目:打印出如下图案(菱形)
*
* *
* ***
* *****
* *******
* *****
* ***
* *
*/
public class Arithmetic18 {
// public static void main(String[] args) {
// int i = 0;
// int j = 0;
// for (i = 1; i <= 4; i++) {
// for (j = 1; j <= 2 * i - 1; j++){
// System.out.print("*");
// }
// System.out.println();
// }
// for (i = 4; i >= 1; i--) {
// for (j = 1; j <= 2 * i - 3; j++){
// System.out.print("*");
// }
// System.out.println();
// }
// }
//菱形
public static void main(String[] args) {
int i = 0;
int j = 0;
for (i = 1; i <= 4; i++) {
for (int k = 1; k <= 4 - i; k++)
System.out.print(" ");
for (j = 1; j <= 2 * i - 1; j++)
System.out.print("*");
System.out.println();
}
for (i = 4; i >= 1; i--) {
for (int k = 1; k <= 5 - i; k++)
System.out.print(" ");
for (j = 1; j <= 2 * i - 3; j++)
System.out.print("*");
System.out.println();
}
}
}
题目十九:
/**
* 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。
* 已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
*
*/
public class Arithmetic17 {
public static void main(String[] args) {
char i, j, k; /* 假设i是a的对手,j是b的对手,k是c的对手 */
for (i = 'x'; i <= 'z'; i++) {
for (j = 'x'; j <= 'z'; j++) {
if (i != j) {// 这样可以减少循环次数,提高效率
for (k = 'x'; k <= 'z'; k++) {
if (i != k && j != k) {
if (i != 'x' && k != 'x' && k != 'z') {// a说他不和x比,c说他不和x,z比
System.out.println(" a Vs " + i + "\n b Vs " + j + "\n c Vs " + k);
}
}
}
}
}
}
}
}
题目二十:
/**
* 题目:求1+2!+3!+...+20!的和
*/
public class Arithmetic20 {
public static void main(String[] args) {
long sum = 0;
long fac = 1;
for (int i = 1; i <= 20; i++) {
fac *= i;
sum += fac;
}
System.out.println("1+2!+3!+...+20!的和是:"+sum);
}
}
题目二十一:
/**
* 题目:利用递归方法求5!。
*/
public class Arithmetic21 {
public static void main(String[] args) {
System.out.println("利用递归方法求5!,结果是:"+factorial(5));
}
public static long factorial(int n){
if(n==0 || n==1){
return 1;
}else{
return factorial(n-1)*n;
}
}
}
题目二十二:
/**
* 题目:求一个3*3矩阵对角线元素之和
*/
public class Arithmetic22 {
public static void main(String[] args) {
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
long sum = 0;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(i == j){
sum += arr[i][i];
}
}
}
System.out.println(sum);
}
}
题目二十三:
import java.util.Random;
/**
* 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
*/
public class Arithmetic23 {
public static void main(String[] args) {
int temp = 0;
int myarr[] = new int[12];
Random r = new Random();
for (int i = 1; i <= 10; i++) {
myarr[i] = r.nextInt(1000);
}
for (int k = 1; k <= 10; k++) {
System.out.print(myarr[k] + ",");
}
for (int i = 1; i <= 9; i++) {
for (int k = i + 1; k <= 10; k++) {
if (myarr[i] > myarr[k]) {
temp = myarr[i];
myarr[i] = myarr[k];
myarr[k] = temp;
}
}
}
System.out.println("");
for (int k = 1; k <= 10; k++) {
System.out.print(myarr[k] + ",");
}
myarr[11] = r.nextInt(1000);
for (int k = 1; k <= 10; k++) {
if (myarr[k] > myarr[11]) {
temp = myarr[11];
for (int j = 11; j >= k + 1; j--) {
myarr[j] = myarr[j - 1];
}
myarr[k] = temp;
}
}
System.out.println("");
for (int k = 1; k <= 11; k++) {
System.out.print(myarr[k] + ",");
}
}
}
题目二十四:
/**
* 打印出杨辉三角形(要求打印出10行如下图)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
*
*/
public class Arithmetic24 {
public static void main(String args[]) {
final int MAX = 10;
int mat[][] = new int[MAX][];
int i = 0, j, n;
n = MAX;
//赋值
for (i = 0; i < n; i++) {
mat[i] = new int[i + 1];
mat[i][0] = 1;
mat[i][i] = 1;
for (j = 1; j < i; j++)
mat[i][j] = mat[i - 1][j - 1] + mat[i - 1][j];
}
//输出
for (i = 0; i < n; i++) {
for (j = 0; j < n - 1; j++)
System.out.print(" ");
for (j = 0; j <= i; j++)
System.out.print(" " + mat[i][j]);
System.out.println();
}
}
}
题目二十五:
import java.util.Scanner;
/**
* 题目:有n个人围成一圈,顺序排号。
* 从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
*/
public class Arithmetic25 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
boolean[] arr = new boolean[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = true;// 下标为TRUE时说明还在圈里
}
int leftCount = n;
int countNum = 0;
int index = 0;
while (leftCount > 1) {
if (arr[index] == true) {// 当在圈里时
countNum++; // 报数递加
if (countNum == 3) {// 报道3时
countNum = 0;// 从零开始继续报数
arr[index] = false;// 此人退出圈子
leftCount--;// 剩余人数减一
}
}
index++;// 每报一次数,下标加一
if (index == n) {// 是循环数数,当下标大于n时,说明已经数了一圈,
index = 0;// 将下标设为零重新开始。
}
}
for (int i = 0; i < n; i++) {
if (arr[i] == true) {
System.out.println(i);
}
}
}
}
题目二十六:
/**
* 题目:字符串排序。
*/
import java.util.ArrayList;
import java.util.Collections;
public class Arithmetic26 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("010101");
list.add("010003");
list.add("010201");
Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
题目二十七:
/**
* 题目:海滩上有一堆桃子,五只猴子来分。
* 第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
* 第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,
* 第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
*/
public class Arithmetic27 {
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 Arithmetic27().fT(0);
}
}