《算法竞赛入门经典》(第2版)第二章习题

以下代码可能有错,请多指教。

习题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));
													}
											}
										}
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值