java第四次作业

题目2

题目4

1.恺撒密码

输入:

偏移量K

待加密的字符串

输出:

加密后的字符串。注意只需用对大小写字母进行变换,其它字符原样输出

public class Main{
	public static void main(String[] args) {
		// 偏移大小
		int offset = Integer.parseInt(StdIn.readLine());
		while (!StdIn.isEmpty()) {
			String inStr = StdIn.readLine();
			char[] arr = inStr.toCharArray();
			// 对单个字符解密
			for (int i = 0; i < arr.length; i++) {
				int chNum = arr[i];
				int passChar = 0;
				// 是否为英文字母
				if (chNum >= 97 && chNum <= 122) {
					passChar = chNum + offset;
					if (passChar > 122) {
						passChar = passChar - 123 + 97;
					}
				} else if (chNum >= 65 && chNum <= 90) {
					passChar = chNum + offset;
					if (passChar > 90) {
						passChar = passChar - 91 + 65;
					}
				} else {
					passChar = chNum;
				}
				arr[i] = (char) passChar;
			}
			// 输出
			System.out.println(arr);
		}
	}
}


2.翻硬币

输入:

初始硬币的数量n

输出:

至少需要多少次翻转,又能恢复最初的正面朝上。

public class Main {
	public static void main(String[] args) {
		// 输入硬币数量
		int N = StdIn.readInt();
		// 定义硬币数字,false:正面 true:背面
		boolean[] bool = new boolean[N];
		// 统计反转次数
		int num = 0;
		// 循环控制条件
		boolean breakFlag = true;
		while (breakFlag) {
			for (int i = 0; i < N && breakFlag; i++) {
				breakFlag = false;
				int j = 0;
				for (; j <= i / 2; j++) {
					// 确定交换位置并交换
					int x = i - j;
					if (x == j) {
						bool[j] = !bool[j];
					} else {
						boolean tmp = !bool[j];
						bool[j] = !bool[x];
						bool[x] = tmp;
					}
				}
				num++;
				// 检测退出条件成立
				for (int k = 0; k < N; k++) {
					if (bool[k]) {
						breakFlag = true;
						break;
					}
				}
			}
		}
		System.out.println(num);
	}
}

黄一鹤提供版本:

import java.util.Scanner;
public class Coins {
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		System.out.println("请输入硬币个数");
		int coins=cin.nextInt();
		int[] ints =new int[coins] ;
		for (int i = 0; i < ints.length; i++) {
			ints[i]=0;
		}
		boolean isTrue = false;
		int i = 1;
		for (;  ; i++) {
			isTrue = true;
			int n = i%coins;
			if(n==0) {
				n=coins;
			}
			changePosition(ints,n);
			trunCoins(ints,n);
			printResult(ints,i);
			for (int j = 0;  j< ints.length; j++) {
				if(ints[j]!=0) {
					isTrue = false;
					break;
				}
			}
			if(isTrue) {
				break;
			}
		}
		System.out.println("```````````````````````````");
		System.out.println("总共"+coins+"个硬币");
		System.out.println("总共需要翻转"+i+"次");
		System.out.println("```````````````````````````");
	}

	public static void changePosition(int[] ints,int position) {
		position = position -1;;
		int i = 0;
		int temp;
		while(i<position) {
			temp = ints[i];
			ints[i]=ints[position];
			ints[position]=temp;
			i++;
			position--;
		}
	}
	
	public  static void trunCoins(int[] ints, int n) {
		for (int j = 0; j < n; j++) {
			ints[j] = (ints[j]+1)%2;
		}
	}
	
	public static void printResult(int[] ints,int n) {
		System.out.print("第"+n+"次翻转结果:");
		for (int j = 0;  j< ints.length; j++) {
			System.out.print(" "+ints[j]);
		}
		System.out.println();
	}
}

3.随机播放和生日“悖论”

输入:

歌曲总数量N,蒙特卡洛模拟的次数T(都是整数)

输出:

取整后的平均次数(为了方便系统进行自动判定,故请输出整数。取整方法:(int)(x+0.5))

public class Main {
	public static void main(String[] args) {
		int N = StdIn.readInt();
		int M = StdIn.readInt();
		boolean arr[]  = null;
		double sum = 0;
		for (int i = 0; i < M; i++) {
			int num = 1;
			arr  = new boolean[N];
			while (true) {
				int rad = (int) (Math.random() * N);
				if(arr[rad]){
					break;
				}
				arr[rad]  = true;
				num ++;
			}
			sum += num;
		}
		 System.out.println((int) (sum / M + 0.5));
	}
}

黄一鹤提供版本:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class MathRandom {
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		int N=cin.nextInt();
		int T=cin.nextInt();
		double sumTimes = 0;
		int result;
		for (int i = 0; i < T; i++) {
			result = returnMandomTimes(N);
			sumTimes = sumTimes + result;
		}
		System.out.println((int)(sumTimes/T+0.5));
	}
	
	public static int returnMandomTimes(int n) {
		Map<Integer, String> map = new HashMap<Integer, String>();
		boolean isExist = false;
		int i = 1;
		while (!isExist) {
			int mathRandom = (int) (Math.random()*n);
			if(null!=map.get(mathRandom)) {
				isExist = true;
			}
			else {
				map.put(mathRandom, "exist");
				i++;
			}
		}
		return i;
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值