以下代码可能有错,请多指教。
习题2-1: 水仙花数(daffodil)
输出100-999中的所有水仙花数。若3位数ABC满足ABC=A3+B3+C3,则称为水仙花数。
例如:153=13+ 53 +33,所以153是水仙花数
package c2;
public class Daffodil {
public static void main(String[] args) {
for(int i=101;i<1000;i++) {
int a = i/100; //百位
int b = i%100/10; //十位
int c = i%100%10; //个位
if(a*a*a+b*b*b+c*c*c==i) {
System.out.println(i);
}
}
}
}
输出结果:
153
370
371
407
习题2-2: 韩信点兵(hanxin)
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。
输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。
已知总人数不小于10,不超过100 。
package c2;
import java.util.Scanner;
public class Hanxin {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = 0;
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
for (int n = 10; n <= 100; n++) {
if ((n % 3 == a) && (n % 5 == b) && (n % 7 == c)) {
System.out.println(n);
count++;
}
}
if (count == 0) {
System.out.println("No answer");
}
sc.close();
}
}
习题2-3:倒三角形(triangle)
输入正整数n<=20,输出一个n层的倒三角形。
例如,n=5时输出如下:
#########
#######
#####
###
#
package c2;
import java.util.Scanner;
public class Triangle {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int oldn = n;
for(;n>0;n--) { //循环行数
for(int i=2*n-1;i>0;i--) { //循环输出#
if(n!=oldn&&i==2*n-1) { //判断是否为第一次在某行输出,如果是,
for(int j=oldn-n;j>0;j--) { //则输出空格
System.out.print(" ");
}
}
System.out.print("#");
}
System.out.println();
}
sc.close();
}
}
习题2-4:子序列的和(subsequence)
输入两个正整数n<m<106 , 输出1/n2 + 1/(n+1)2 + …… + 1/m2,保留5位小数。
输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。
package c2;
import java.util.ArrayList;
import java.util.Scanner;
public class Subsequence {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//因为不确定会输入几组数据,所以采用集合存储
ArrayList<Long> al = new ArrayList<Long>();
long m = 0,n = 0; //确保不会超出int范围
do {
m = sc.nextLong();
n = sc.nextLong();
if(m!=0&&n!=0) { //都不为0时存入集合
al.add(m);
al.add(n);
}
}while(m!=0&&n!=0); //都为0时结束循环
sc.close();
for(int i=0;i<al.size();i+=2) {
Subse(al.get(i),al.get(i+1)); //输出结果
}
}
/**
* 输入两个正整数n<m<10^6,输出1/n^2 + 1/(n+1)^2 + …… + 1/m^2,保留5位小数。
* @param n
* @param m
*/
public static void Subse(long n, long m) {
float sum = 0;
for (; n <= m; n++) {
sum += 1.0 / (n * n);
}
System.out.println(String.format("%.5f", sum));
}
}
习题2-5:分数化小数(decimal)
输入正整数a,b,c,输入a/b的小数形式,精确到小数点后c位。a,b≤106,c≤100。
输入包含多组数据,结束标记为a=b=c=0
package c2;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Scanner;
public class Decimal {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Integer> al = new ArrayList<Integer>();
Integer a, b;
int c;
do {
a = sc.nextInt();
b = sc.nextInt();
c = sc.nextInt();
if (a != 0 && b != 0 && c != 0) {
al.add(a);
al.add(b);
al.add(c);
}
} while (a != 0 && b != 0 && c != 0);
sc.close();
for (int i = 0; i < al.size(); i += 3) {
Dec(al.get(i), al.get(i + 1), al.get(i + 2));
}
}
/**
* 输入正整数a,b,c,输入a/b的小数形式,精确到小数点后c位。a,b≤10^6,c≤100。
* @param a
* @param b
* @param c
*/
public static void Dec(Integer a, Integer b, int c) {
//先将a或者b转为float
int a1 = a.intValue();
float a2 = (float) a1;
//自定义保留小数的方法
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(c);
System.out.println(nf.format(a2 / b));
}
}
习题2-6:排列(permutation)
用1-9组成3个三位数abc,def,ghi,每个数字恰好使用一次。
要求abc:def:ghi=1:2:3。
按照"abc def ghi"的格式输出所有解,每行一个解。
package c2;
public class Permutation {
public static void main(String[] args) {
for(float a=1;a<=9;a++)
for(float b=1;b<=9;b++)
for(float c=1;c<=9;c++)
for(float d=1;d<=9;d++)
for(float e=1;e<=9;e++)
for(float f=1;f<=9;f++)
for(float g=1;g<=9;g++)
for(float h=1;h<=9;h++)
for(float i=1;i<=9;i++) {
if(a==b||a==c||a==d||a==e||a==f||a==g||a==h||a==i
||b==c||b==d||b==e||b==f||b==g||b==h||b==i
||c==d||c==e||c==f||c==g||c==h||c==i||d==e
||d==f||d==g||d==h||d==i||e==f||e==g||e==h
||e==i||f==g||f==h||f==i||g==h||g==i||h==i) {
continue;
}else {
if((d*100+e*10+f)/(a*100+b*10+c)==2
&&(g*100+h*10+i)/(a*100+b*10+c)==3) {
System.out.println((int)(a*100+b*10+c)+" "+(int)(d*100+e*10+f)+" "+(int)(g*100+h*10+i));
}
}
}
}
}