python三人同行七十稀_【算法入门第二章练习题】(示例代码)

习题2-1 水仙花数

输出100~999中的所有水仙花数。若3位数ABC满足ABC=A2+B2+C2,则称其为水仙花数。例如:153=12+52+32,所以153是水仙花数。

解析:只有1000个数,直接暴搜就好了。

1 public classQ21 {2 public static voidmain(String[] args) {3 for (int i = 1; i < 10; i++) {4 for (int j = 0; j < 10; j++) {5 for (int k = 0; k < 10; k++) {6 int sum = i * 100 + j * 10 +k;7 if(sum==Math.pow(i,3)+Math.pow(j,3)+Math.pow(k,3))8 System.out.println(sum);9 }10 }11 }12 }13 }

知道有一天我看见了

#include

int main (void)

{int first = 1;for (int i = 100; i < 1000; i++)

{int c = i%10;int b = i/10%10;int a = i/100;if (a*a*a+b*b*b+c*c*c ==i)

{if(first)

first= 0;elseprintf (" ");

printf ("%d",i);

}

}return 0;

}

int c = i%10;

int b = i/10%10;

int a = i/100;

第一次知道 还能这么用一个循环得出三个数

再次强化一个概念 / 取前 %取后

习题2-2 韩信点兵

相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解,即输出No answer)。已知总人数不小于10,不超过100.输入到文件结束为止。

样例输入:

2 1 6

2 1 3

样例输出:

Case 1: 41

Case 2:No answer

除了枚举还有一个

算统的方法 但是感觉有点复杂 就不理解了

大道至简 解决就好 贴在后面  愿意了解就看看

三人同行七十稀,

五数梅花甘一枝,

七子团圆正半月,

除百零五便得知。

甘一是21,正半月是15,除百零五的意思就是求105的余数。可以发现70是5和7的最小公倍数,21是3和7的最小公倍数,15是3和5的最小公倍数,105是3、5、7的最小公倍数。因此这四句口诀的意思就是用任意两数的最小公倍数乘第三个数并求和,对和求105的余数即可得到答案

输入正整数n≤20,输入一个n层的倒三角形。例如,n=5时输出如下:

#########

#######

#####

###

#

importjava.util.Scanner;public classQ22 {public static voidmain(String[] args) {//Scanner scanner = new Scanner(System.in);//int n = scanner.nextInt();

int n = 5;for (int i = 0; i < n; i++) {for (int j = 0; j < i; j++) {

System.out.printf(" ");

}int k = 2 * (n - i) - 1;for (int z = 0; z

System.out.printf("*");

System.out.println("");

}

}

}

和网上的差不多 但是循环套循环 感觉要加强一下 说懂也懂 不懂也很懵

!重新理解一下 循环条件

满足进 不满足不进

输入两个正整数,n

样例输入:

2 4

65536 655360

0 0

样例输出:

Case 1: 0.42361

Case 2: 0.00001

public classQ24 {public static voidmain(String[] args) {double m = 4.0, n = 2.0;double sum = 0.0;for (double i = n; i <= m; i++) {

sum+= 1 / i *i;

}

System.out.println(sum);

}

}

习题2-6 排列

用 1,2,3…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。

解析:因为搜索范围是100~999而已,所以提示的意思大概就是让我们直接用暴搜找出符合条件的数就好了。即使是暴搜我们还是可以将范围再缩小一点,根据题目要求,可以用到的最小的数(作为abc)是123,最大的数(作为ghi)是987,由最大数可以根据3个数的比例推算出最小数abc的上限为987÷3=329,因此最小数abc的范围是123~329(如果不缩小范围还需要加一个判断ghi是否大于1000的判断条件,稍加思考即可发现超过329的三位数abc绝大部分对应的三位数ghi都超过了1000,不缩小范围浪费了很多时间)。题目要求1~9这9个数字不能每个只能出现一次,那么输出条件就是三个三位数拆分后的和要正好等于45(1+2+…+9=45)。

public classQ26 {public static voidmain(String[] args) {for (int i = 123; i <= 329; i++) {int j = i * 2;int k = i * 3;if (isOK(j) == 1 && isOK(k) == 1 &&is2OK(i,j)==1&&is2OK(i,k)==1&&is2OK(j,k)==1){

System.out.printf(i+ " " + i * 2 + " " + i * 3);

System.out.println();

}

}

}private static int isOK(intnum) {if (num > 100 && num < 999) {if (num / 100 != num / 10 % 10 && num / 100 != num % 10 && num / 10 % 10 != num % 10)return 1;else

return 0;

}else

return 0;

}private static int is2OK(int n1, intn2) {int hun1 = n1 / 100;int dec1 = n1 / 10 % 10;int uni1 = n1 % 10;int hun2 = n2 / 100, dec2 = n2 / 10 % 10, uni2 = n2 % 10;if (hun1 != hun2 && hun1 != dec2 && hun1 != uni2 & dec1 != hun2 && dec1 != dec2 && dec1 != uni2 && uni1 != hun2 && uni1 != dec2 && uni1 !=uni2)return 1;else

return 0;

}

}

功能函数化 很有用 很屌

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值