第一题:
- /*
- * 题目: 两个兵乓球队进行比赛,各出三个人。各队选手的编号均为1号,2号,3号,抽签决定比赛名单,
- * 有人向队员打听比赛的名单。甲队1号说不和乙队的1号比,甲队的3号说不和乙队的1号和3号比,
- * 请编程找出两队的赛手名单。
- *
- * 思路: 寻找对战名单,相当于确定一组数据对,但甲队的人员顺序是一定的,最终目的就是要寻找对应的
- * 乙队人员的出战顺序。相当于将三个不同的数按一定顺序填入到三个坑中。填入的条件首先肯定是
- * 要保证三个数各不相同,相当于对1,2,3三个数进行全排列。满足了各不相同的条件,还要满足题目
- * 所给的条件,即在全排列中将第一个坑里为1的,和第三个坑里为1或3的排除掉,剩下的那组数就是名单。
- *
- * 步骤: 首先定义a,b,c三个变量(相当于三个坑)分别用于存放甲队1、2、3号球员的对手。
- * 然后通过循环枚举出可能值往里面填数。填的过程中排除a、b、c三者各不相等
- * 并且保证a != 1, c!= 1和3.剩下的就是乙队可能的出战顺序。
- */
- public class VsList {
- public static void main(String[] args) {
- int a, b, c; //a, b, c分别用于存储甲队1、2、3号球员的对手编号
- for(a = 1; a <= 3; a++){
- for(b = 1; b <= 3; b++){ //先对a,b的取值进行枚举
- if(a != b){ //为true表示甲队一号二号球员的对手不同
- for(c = 1; c <= 3; c++){ //枚举c的取值
- if(a != c && b != c){ //至此为true表示甲队三名球员对手各不相同
- if(a != 1 && c != 1 && c != 3){ //队友特殊条件判断
- System.out.println("甲队1号 vs 乙队" + a + "号");
- System.out.println("甲队2号 vs 乙队" + b + "号");
- System.out.println("甲队3号 vs 乙队" + c + "号");
- }
- }
- }
- }
- }
- }
- }
- }/* Output:
- 甲队1号 vs 乙队3号
- 甲队2号 vs 乙队1号
- 甲队3号 vs 乙队2号
- *///:~
复制代码 第二题:
- /*
- * 题目: 打印出所有三位数中即是水仙数又是回文数的数,如果没有这个数那么输出所有的水仙数。
- * 水仙数是指一个三位数,其个位数立方和等于本身,例如:153=13+53+33
- * 回文数是121置换后还是其本身,而132就不是回文数,因为置换后是231。
- *
- *
- * 思路: 1.既然是在所有三位数中选择,且判断方式没有简单规律需要一个数一个数的判断,那么就要考虑
- * 进行一次从100~999之间的遍历,每个数分别判断是否为水仙数或回文数
- *
- * 2.判断水仙数和回文数都是对3位数中各位数进行操作,因此需要提取出三位数的各数位上的值
- *
- * 3.题目要求没有二者皆是的才打印水仙数。那么在遍历过程中,无法判断是否打印,要在遍历结束后
- * 才知道是否包含有二者皆是的数。因此需要对水仙花数进行保存,并且记录下是否包含二者皆是的数。
- *
- *
- * 步骤: 先弄3个int变量准备好保存百位、十位、个位的处理结果(只在循环里有用,放for里了)
- * 保存水仙数使用ArrayList(因数量未知)
- * 定义一个int计数器用来记录水仙数的个数,这个只是为了确定是否有,所以定义个boolean也行
- * 之后弄个循环开始遍历,提取数位可以用数学方法,也可以借助字符串,这里用了前者
- * 剩下的就没啥好说的了,各种if判断下条件选择输出内容就OK了
- */
- import java.util.ArrayList;
- public class FindNum {
- public static void main(String[] args) {
- ArrayList<Integer> shuiXianList = new ArrayList<Integer>(); //用于存储水仙数
- int count = 0; //记录既是水仙数又是回文数的数的个数
- for(int i = 100, a, b, c; i < 1000; i++){ //a,b,c用于保存百位、十位、个位的处理结果
- a = (int)Math.pow(i / 100, 3); //取出百位值做立方运算
- b = (int)Math.pow(i % 100 / 10, 3); //取出十位值做立方运算
- c = (int)Math.pow(i % 10, 3); //取出个位值做立方运算
- if (i == a + b + c){
- if(a == c){ //两数的立方相等说明两数相等
- System.out.println(i + "既是水仙数又是回文数");
- count++; //一个回文水仙计数器
- }
- shuiXianList.add(i);
- }
- }
- if(count == 0){ //通过判断计数器是否正值确定是否有回文水仙数
- System.out.println("没有找到既是水仙数又是回文数的数");
- System.out.println("水仙数有:");
- for(int i : shuiXianList){ //foreach循环,遍历ArrayList
- System.out.println(i);
- }
- }
- }
- }/* Output:
- 153
- 370
- 371
- 407
- *///:~
复制代码 第三题 :- /*
- * 题目: 打印出100到200之间中即不是回文数又不是素数又不是水仙数的所有数的和。
- *
- * 思路: 回文数--个位百位相同
- * 水仙数--各位的三次方之和等于本身
- * 素数----除1、本身外,无法被其他整数整除
- * 设置一个累加器,每找到一个符号要求的,就加进去
- * 遍历100~200之间的每一个数,然后分别验证其是否为素数、回文、水仙,如果都不是即符合要求
- * 素数的判断:每取一个数i就用从2到Math.sqrt(i)之间的整数对其取模,模全不为0即为素数
- * 其他两种的判断参考题目2
- *
- *
- * 步骤: 为了方便,依然定义3个int来保存各位上的值,用于判断回文和水仙时用。
- * 弄个for遍历100~200
- * 对每个数进行3次判别,其中素数的判别还需再用一次for遍历
- * 三个判断都不是,加之
- */
- public class FindNum2 {
- public static void main(String[] args) {
- int sum = 0;
- for(int i = 100, a, b, c; i <= 200; i++){ //a,b,c用于保存百位、十位、个位
- a = (int)Math.pow(i / 100, 3);
- b = (int)Math.pow(i % 100 / 10, 3);
- c = (int)Math.pow(i % 10, 3); //取出百、十、个位值做立方运算
- if (a != c){ //为true说明不是回文数
- if(i != a + b + c){ //为true说明也不是水仙数
- for(int j = 2; j <= (int)Math.sqrt(i); j++){ //遍历小于i的平方根的整数
- if(i % j == 0){ //被整除说明不是素数
- sum += i; //结果丢入累加器
- break; //继续测试下一个目标数
- }
- }
- }
- }
- }
- System.out.println("100到200之间中既不是回文数又不是素数又不是水仙数的所有数的和为" + sum);
- }
- }/* Output:
- 100到200之间中既不是回文数又不是素数又不是水仙数的所有数的和为11125
- *///:~
复制代码 论坛使用很菜~,输出结果也很简单,就不截图了,直接注释在了每段代码结尾处~~
|