原题链接:蓝桥杯2013年第四届真题-带分数
解题思路:
先将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语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复