Java经典问题

1.金额转换问题 

答案:

public class RenMingBi { 

 /** 

 * @param args add by zxx ,Nov 29, 2008 

 */ 

 private static final char[] data = new char[]{ 

 '零','壹','贰','叁','肆','伍','陆','柒','捌','玖' 

 }; 

 private static final char[] units = new char[]{ 

 '元','拾','佰','仟','万','拾','佰','仟','亿' 

 }; 

 public static void main(String[] args) { 

 // TODO Auto-generated method stub 

 System.out.println( 

 convert(135689123)); 

 } 

 public static String convert(int money) 

 { 

 StringBuffer sbf = new StringBuffer(); 

 int unit = 0; 

 while(money!=0) 

 { 

 sbf.insert(0,units[unit++]); 

 int number = money%10; 

 sbf.insert(0, data[number]); 

 money /= 10; 

 } 

 return sbf.toString(); 

 } 

} 

2.阶乘后连续 0 个数问题 

答案:10 = 2 * 5。每一个 2 与一个 5 相乘,结果就增加一个零。所以求 n! 后面的连续

零的个数,其实就是求其中相乘的数含有因子每对因子 2 与 5 的个数。又因为从 1 到某

个数,所含 2 的个数比 5 多,所以问题就可以进一步简化到求含有因子 5 的个数。 

JAVA 实现代码如下: 

static int zeroCount ( int n) { 

int counter = 0; 

for( int i = 5,m; i <= n; i += 5) { 

m = i; 

while ( m % 5 == 0) { 

counter++; 

m /= 5; 

} 

} 

     return counter;   
}   

进一步优化算法: 

 static int zeroCount ( int n) { 

 int counter = 0; 

 while ( n >= 5) { 

 n /= 5; 

 counter += n; 

 } 

 return counter; 

 } 

3.质数问题 

答案: 

public static void main(String[] args){ 

 Random rd = new Random(); //定义一个随机变量 

 int i = rd.nextInt(1000); //获取个随机数 

 System.out.println(isNum(i)); //输出结果 

 } 

 public static String isNum(int i ){ 

 String ret =i+"是质数"; //默认是质数 

 if(i==2) 

 return ret; //如果是 2 返回默认结果 

 for (int j = 2; j < i/2; j++) { //制订循环次数 

 if(i%j==0){ 

 ret=i+"不是质数"; // 如果能够整除返回不是质数 

 break; 

 } 

 } 

 return ret; //返回结果 

 } 

4.数字黑洞问题(尚未解决哦) 

问题:有任意一个 5 位数,如:34256,把它的各位数字打乱,重新排列,就可得到一个最

大的数:65432,还有一个最小的数 23456。求这两个数字的差,得:41976,然后把这个

数字再次重复上述过程(如果不足 5 位,则前边补 0)。如此往复,数字会落入某个循环圈

(称为数字黑洞)。比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。 

 请编写程序,找到 5 位数所有可能的循环圈,并输出,每个循环圈占 1 行。其中 5 位

数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:[82962, 75933, 

63954, 61974],其中数字的先后顺序可以不考虑。 

5.百鸡问题 

问题:3 文钱可以买 1 只公鸡,2 文钱可以买一只母鸡 1 文钱可以买文钱可以买 3 只小鸡。

用 100 文 钱买 100 只鸡,那么各有公鸡母鸡小鸡多少只? 

答案:遍历的时候当公鸡 母鸡 小鸡的价格总和操作 100 文的时 后面就可以不再遍历了 

 例如当公鸡 a= 20 的时候 母鸡 b 肯定<=20 20*3(公鸡的价格总和)+20*2(母鸡的价

格总和)+小鸡的价格总和 >=100,这个时候循环就可以终止了,但是循环条件里面是

for(int b = 0; b<=50; b++),所以对于 20<b<=50 这个取值区间没有必要在进行遍历了。 

for(int a = 0; a<=33; a++){//最多 33 只公鸡 

    for(int b = 0; b<=50; b++){//最多 50 只母鸡 

        int c = 100 - a - b; //c 只小鸡 

        if((a*3 + b*2 + c/3 == 100) && c%3 == 0 ){ 

            System.out.println(a + "只公鸡," + b + "只母鸡," + c + "只小鸡"); 

        } 

        if(a*3 + b*2 + c/3 > 100) break; 

    } 

} 

6.1~1000 累乘后面有多少个零问题 

答案:

public static void main(String[] args) { 
    BigInteger bi = new BigInteger("1");//初始化值为 1 
    for(int i=2;i<1001;i++){ 
        bi=bi.multiply(BigInteger.valueOf(i));//这里是做乘法运算 
    } 
    int N=0; 
    String s=bi.toString();//结果转化为字符串 
    for(int i=0;i<s.length();i++){ 
        if(s.charAt(i)=='0'){ 
            N++;//有一个 0 就加上 1 
        } 
    } 
    System.out.println("1000!中共有 0 的个数为:"+N); 
} 

7.猴子分桃问题(尚未解决哦) 

问题:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,

这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又

多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做

的,问海滩上原来最少有多少个桃子? 

8.蚂蚁爬木杆问题 

问题:有一根 27 厘米的细木杆,在第 3 厘米、7 厘米、11 厘米、17 厘米、23 厘米这五个

位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始 时,蚂蚁的头朝左还是朝

右是任意的,它们只会朝前走或调头, 但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会

同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离

开木杆 的最小时间和最大时间。 

9.螺旋矩阵问题 

问题: 输出 n=5 的螺旋方阵 

 1 2 3 4 5 

 16 17 18 19 6 

 15 24 25 20 7 

 14 23 22 21 8 

 13 12 11 10 9 

答案: 

public class Main{

	public static void main(String[] args) {
		// 设定参数

        final int N = 7;

		final int COUNT = 11;

		// 初始化

		int mat[][] = new int[N][N];

		for (int i = 0; i < N; i++) {

			for (int j = 0; j < N; j++) {

				mat[i][j] = 0;

			}

		}

		{// 写入

			int i = 0;

			int j = 0;

			int count = COUNT;

			mat[0][0] = count++;

			while (count < N * N + COUNT) {

				while (j + 1 < N && mat[i][j + 1] == 0) {

					mat[i][++j] = count++;

				}

				while (i + 1 < N && mat[i + 1][j] == 0) {

					mat[++i][j] = count++;

				}

				while (j - 1 >= 0 && mat[i][j - 1] == 0) {

					mat[i][--j] = count++;

				}

				while (i - 1 >= 0 && mat[i - 1][j] == 0) {

					mat[--i][j] = count++;

				}

			}

		}

		// 输出

		for (int i = 0; i < N; i++) {

			for (int j = 0; j < N; j++) {

				String out = String.valueOf(mat[i][j]);

				String str = " ";

				out = str.substring(0, 5 - out.length()) + out;

				System.out.print(out);

			}

			System.out.println();

		}

	}

}

10.数字转换大小写问题 

答案:

public class Test { 

	public static void main(String[] args) {

		// 键盘输入,转换成字符型数组

		Scanner sc = new Scanner(System.in);

		// 为了提示,我们打印一句"请在键盘上输入一串数字:"

		System.out.println("请在键盘上输入一串数字:");

		// 接收字符串

		String str = sc.nextLine();

		// 调用方法.toCharArray();将字符串转译成 char 型数组

		char[] num = str.toCharArray();

		// 定义数组,将大写的数字也录入数组

		char[] China = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };

		// 遍历数组

		for (int i = 0; i < num.length; i++) {

			for (int j = 0; j < China.length; j++) {

				// 用 num[i]-'0'得到 China[]脚标并打印相对应的元素

				if (num[i] - '0' == j) {

					// 根据题目提示,输出时我们不需要换行

					System.out.print(China[j]);

				}

			}

		}

	}

} 

11.数组去除重复问题 

答案:

public static void moveSame(int[] arr){ 

    int[] newarr = null; 

    ArrayList list = new ArrayList(); 

    for(int i : arr){ 

        if(!list.contains(i)){ 

            list.add(i); 

        } 

    } 

} 

12.希尔排序 

答案:

public static void xierpaixu(int array[], int length) {// 10
		int len = length / 2;
		int i, j, temp;
		while (len >= 1) {
			// 每次都取它的中间下标, 循环的次数等于总长/2,除的次数
			for (i = len; i < length; i++) {// 从 5 的下标循环到 9 下标
				temp = array[i];// 保存值
				j = i - len;// j 是从 0 的下标变换到下标 4
				// 0 到 4 的下标,每个值和 temp 比较,交换 j 和 temp 的值
				while (j >= 0 && array[j] > temp) {
					// 如果 0 下标的值大于中间下标的值
					array[j + len] = array[j];// 0 下标的值给中间的角标
					j = j - len;// 改变 j 的下标,这时 j 为负数,跳出循环
				}
				// 把 j 变成 0 的下标,给下标 j 赋值,j 是当前循环时的下标,
				array[j + len] = temp;
			}
			len = len / 2; // 缩小增量
		}
		for (int a = 0; a < length; a++) {// 遍历数组
			System.err.print(array[a] + ",");
		}
}

猜你喜欢

转载自blog.csdn.net/qq_36120267/article/details/82114003
今日推荐