解题思路:
先将1-9这9个数全排列,然后去寻找+和/的位置,因为需要给后面的除法留位置,所以加号前的数最长也只能是7位数,而且因为后面的除法运算不能为0,所以除数最长只能在倒数第二个数就停止截取。然后就是去判断除数是否能整除(很重要),还有就是这个算式能不能得出等于n的结果,能就加一。
注意事项:
边界!!!边界!!!这题最要注意的就是边界,最难的和最重要的就是全排列和循环找+和/的位置。
参考代码:
import java.util.Scanner; public class zz带分数 { /** * @param args */ static int []arr={1,2,3,4,5,6,7,8,9}; static int n; static int count=0; public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner=new Scanner(System.in); n=scanner.nextInt(); qpl(0); System.out.println(count); } //全排列 public static void qpl(int n) { if (n==9) { scc(arr); } for (int i = n; i < 9; i++) { int zjs=arr[i]; arr[i]=arr[n]; arr[n]=zjs; qpl(n+1); //回溯(换回去) zjs=arr[i]; arr[i]=arr[n]; arr[n]=zjs; } } public static void scc(int []arr) { for (int i = 1; i <= 7; i++) { int jhq=jq(0, i);//加号前的数 if (jhq>=n) { continue; } // /号前的数 //这里的边界也很需要注意,因为我下面写的方法是根据长度来截取,所以这里的9-i其实 //是表示能被截取的长度而不是下标,这里要很注意(我都被绕进去了,把他当做下标导致 //被除数最少也是两位数,找了半天才想起来,这里是长度,不是下标,才把9改成9-i) for (int j = 1; j < 9-i; j++) { int num1=jq(i, j); int num2=jq(i+j, 9-i-j); if (num1%num2==0&&jhq+num1/num2==n) { count++; } } } } //将截取的数从数组中取出来算成数(我这里写的方法是根据起点下标和截取长度来截取的,这里要注意一下) public static int jq(int qd,int cd) { int nn=1; int num=0; for (int i =qd+cd-1; i >=qd; i--) { num+=arr[i]*nn; nn*=10; } return num; } }
0.0分
2 人评分
三角形 (C++代码)记忆化搜索浏览:1317 |
C语言程序设计教程(第三版)课后习题11.8 (C语言代码)浏览:756 |
整除问题 (C语言代码)浏览:594 |
输入输出格式练习 (C语言代码)浏览:773 |
10月月赛题解浏览:554 |
C二级辅导-温度转换 (C语言代码)浏览:575 |
求圆的面积 (C语言代码)浏览:712 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:479 |
C语言训练-自守数问题 (C语言代码)浏览:702 |
Manchester-台球碰撞-(附带图解)浏览:3787 |