各位大神帮我解决一下这个程序。关于排列组合的问题。用java,C都可以,有详细的代码最好。非常感谢啦!!
做了一个出来,但是没有你给的那个图片那样用彩色的方式排列,而且是横向排列的
import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Scanner;import jxl.Workbook;import jxl.write.Label;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;import jxl.write.WriteException;import jxl.write.biff.RowsExceededException;public class TestCombination {private static final int START = 1; // 开始的数private static final int END = 49; // 结束的数private static List arrList = new ArrayList();private static int count = 2; // 组合的长度private static Scanner sc;private static final String EXCEL_PATH = "F://组合数.xls"; // 要保存的excel文件地址public static void main(String[] args) {sc = new Scanner(System.in);combine();int formerIndex = 1;String split = "";int row = 0;try {WritableWorkbook book = Workbook.createWorkbook(new File(EXCEL_PATH));WritableSheet sheet = book.createSheet(count + "元组合", 0);int cell = 0;for(int[] arr : arrList) {if(formerIndex != arr[count - 2]) {formerIndex = arr[count - 2];System.out.println();split = "";row ++;cell = 0;}String str = Arrays.toString(arr);sheet.addCell(new Label(cell, row, str.replace("[", "").replace("]", "")));System.out.print(split + str);cell ++;split = ",";}book.write();book.close();} catch (IOException e) {e.printStackTrace();} catch (RowsExceededException e) {e.printStackTrace();} catch (WriteException e) {e.printStackTrace();}System.out.println("
共生成" + arrList.size() + "种组合");}private static void combine() {do {System.out.print("请输入组合长度:");count = sc.nextInt();} while(count END);combine2(START, new int[count], 0);}private static void combine2(int start,int arr[], int current) {if(start > END) {return;}for(int i = start; i <= END; i ++) {arr[current] = i;if(current == count - 1) {arrList.add(Arrays.copyOf(arr, count));} else {combine2(i + 1, Arrays.copyOf(arr, count), current + 1);}}}}这里需要导入第三方类库,在附件里,把类库引入工程就可以了。
稍加修改可以实现类似你给的图片的格式
import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Scanner;import jxl.Workbook;import jxl.format.Alignment;import jxl.format.Border;import jxl.format.BorderLineStyle;import jxl.format.Colour;import jxl.write.Number;import jxl.write.WritableCellFormat;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;import jxl.write.WriteException;import jxl.write.biff.RowsExceededException;public class TestCombination {private static final int START = 1; // 开始的数private static final int END = 49; // 结束的数private static List arrList = new ArrayList();private static int count = 2; // 组合的长度private static Scanner sc;private static final Colour[] COLOURS = {Colour.BROWN, Colour.RED,Colour.ROSE, Colour.BLUE, Colour.GOLD, Colour.GREEN, Colour.YELLOW};private static final String EXCEL_PATH = "F://组合数.xls"; // 要保存的excel文件地址public static void main(String[] args) {sc = new Scanner(System.in);combine();int formerIndex = arrList.get(0)[count - 2];String split = "";int row = 0;try {WritableWorkbook book = Workbook.createWorkbook(new File(EXCEL_PATH));WritableSheet sheet = book.createSheet(count + "元组合", 0);int cell = 0;for(int[] arr : arrList) {if(formerIndex != arr[count - 2]) {formerIndex = arr[count - 2];System.out.println();split = "";row ++;cell = 0;}String str = Arrays.toString(arr);for(int i = 0; i < arr.length; i ++) {WritableCellFormat wcf = new WritableCellFormat();wcf.setBackground(COLOURS[cell % COLOURS.length]);wcf.setAlignment(Alignment.CENTRE);wcf.setBorder(Border.ALL, BorderLineStyle.THIN);wcf.setWrap(true);sheet.addCell(new Number(cell * count + i, row, arr[i], wcf));}System.out.print(split + str);cell ++;split = ",";}book.write();book.close();} catch (IOException e) {e.printStackTrace();} catch (RowsExceededException e) {e.printStackTrace();} catch (WriteException e) {e.printStackTrace();}System.out.println("
共生成" + arrList.size() + "种组合");}}但是如果设置的数组是3的话,那么列数就会超出,所以我还是用横向的排列。
这个程序希望能帮到你。
我的output
.....(太多了,省略)
442869
442869
424869
244869
424869
244869
Total weird numbers: 396
............permu time: 13 milliseconds..........
程序代码如下:
package test;
import java.util.Date;
/**
*
* @author liang.rao@gmail.com
* @date 16.Nov.2007
* @why zhidao.baidu.com : question/39707738.html
*
*/
public class WeirdNumbers {
public static int counter = 0;
// print N! permutation of the elements of array a (not in order)
public static void perm2(String s) {
int N = s.length();
char[] a = new char[N];
for (int i = 0; i < N; i++)
a[i] = s.charAt(i);
perm2(a, N);
}
private static void perm2(char[] a, int n) {
if (n == 1 && numberControl(a)) {
System.out.println(a);
counter++;
return;
}
for (int i = 0; i < n; i++) {
swap(a, i, n - 1);
perm2(a, n - 1);
swap(a, i, n - 1);
}
}
// swap the characters at indices i and j
private static void swap(char[] a, int i, int j) {
char c;
c = a[i];
a[i] = a[j];
a[j] = c;
}
private static boolean numberControl(char[] a) {
boolean allOk = true;
if (a[1]=='6')
allOk = false;
for(int i = 0; i < a.length-1; i++ ) {
if((a[i]=='8' && a[i+1]=='9')||(a[i]=='9' && a[i+1]=='8'))
allOk = false;
}
return allOk;
}
public static void main(String[] args) {
String elements = "244689";
Date dt3 = new Date();
perm2(elements);
Date dt4 = new Date();
System.out.println("Total weird numbers: " + counter);
System.out.println("............permu time: " + (dt4.getTime() - dt3.getTime())
+ " milliseconds..........");
}
}
要得到完整的output还有两个办法一是把它写入
new PrintStream(new FileOutputStream("output.txt")); 对象里面
或者用下面这个办法进行排版
if (n == 1 && numberControl(a)) {
System.out.print(a);
System.out.print(" ");
if (counter % 10 == 9)
System.out.println("");
counter++;
return;
}
选五个需要的出来,就是选两个不需要的出来,下面的程序就是选两个不需要的,然后打印需要的。
#include <stdio.h>
int main(void)
{
int num[] = { 1, 2, 3, 4, 5, 6, 7 };
int i = 0, j = 0;
int k;
for (i = 0; i < 7; i++) // 外层循环,确定第一个不需要的数的下标
{
for (j = i+1; j < 7; j++) .//内层循环,确定第二个不需要的数的下标,第二个不需要的数据的下标肯定比地一个不需要的数据的下标大。
{
if (j <= 2) // 第二个不需要的数据的下标小于2,肯定有4567剩下,所以这组不行。
continue;
if (i >= 4)//地一个不需要的数据的下标大于4,肯定有1234剩下,所以这组不行。
continue;
if ((j - i) >= 5) // 第二个下表比地一个大5,不行,比如第一个下标为0,第二个下标为5,那么剩下数据是23457,这样的组合也不满足要求。
continue;
for (k = 0; k < 7; k++)
{
if ((k != i) && (k != j)) // 不打印选出来的两个数据
printf("%d ", num[k]);
}
printf("\n");
}
}
return 0;
}
C语言程序帮忙解决一下。
整理一下题目:score<65 没有获奖 65<score<71 优秀奖 71<=score<=81 三等奖 81<score<=91 二等奖 91< score 一等奖 成绩肯定为正数,所以负数时就退出,成绩还有可能为99.5分,所以设定为单精度类型就好了。程序实现如下图:...
哪位大神帮我看下下面这个程序的错误在哪. 输入m=20 n=7时 结果为-2...
20的阶乘20!已经超出int所能表达的范围,用long long型试试,或者double型。
麻烦哪位电脑大师帮我编写一下下面这个程序,是bat文件
echo offcd \/d "E:\\Program Files\\腾讯游戏\\NBA2K Online\\Logs"rd \/q \/s Cachemkdir "E:\\Program Files\\腾讯游戏\\NBA2K Online\\Logs\\Cache"
哪位大神帮忙解决一下,不胜感激
方法\/步骤 1、 鼠标右键单击“我的电脑”图标,从弹出的快捷菜单中执行“管理”,打开“计算机管理”窗口,在该窗口的左侧显示区域,依次展开“服务和应用程序”\/“服务”选项。2、在“服务”选项所在的右侧显示区域中,找到Windows Management Instrumentation服务,并用鼠标右键单击该服务选项,从弹出的快捷...
请问大神们,电脑出现这个应用程序错误是什么原因呢?是我内存条坏了吗...
当然,出现了“该内存不能为read或written”的故障也不一定都是内存的问题,电脑中了病毒或木马以及运行的程序本身的Bug也会造成这种现象。很难分清究竟是什么原因造成的,一时半会不好排除,但没关系,按确定、取消,重启,即可。感兴趣的网友可用下述办法试着去解决:1、打开的程序太多,如果同时打开...
程序运行闪退,错误日志看不太懂,有没有大神能帮我分析一下
闪退的原因和处理方法 1、缓存垃圾过多 平时在使用软件的过程中,会产生一些垃圾文件,如果长时间不清理会导致手机越来越卡,也会出现闪退状况。进入设置–应用程序——全部——找到有问题的应用程序,清除数据或者缓存。(注:清除数据,会清除掉应用的个人设置、账户信息等。)2、运行程序过多 如果不进行...
一段MATLAB程序,出现了错误,大神帮我改一下
可以这样改:function Yd=power_tra(t,YY)发电机转子摇摆曲线方程 t一定是标量形式的自变量 YY必须是列向量 global y0 Tj Pt E U x1 %在函数中定义全局变量传递参数 发电机转子摇摆曲线微分方程 Yd=[(YY(2)-1)*y0;(Pt-(E*U\/x1)*sin(YY(1)))\/Tj];end { 主程序,另存为main.m,再...
跪求大神。帮我看一下这个程序为什么xs128中的ad只能转换一次。第二次...
xs128是飞思卡尔的MCU吧,没接触过这个CPU,所以我只能从程序结构上面来分析。没有进行第2次的AD转换结果可能有 1: while(!ATD0STAT2_CCF0); 死在这个循环里面了,这个应该是完成置位的寄存器,你看下是不是AD初始化设置的问题。2:也就是最有可能的问题,就是转换后,继续转换的相关寄存器值被...
...尝试清除历史记录来恢复”有哪位大神帮解决一下!
这是软件程序出错导致的,将该应用的数据和缓存删除即可,这里以OPPO R9S手机清除微信为例,具体方法如下:一、首先在手机桌面点击”设置“图标,如图。二、然后在手机的设置界面选择”应用管理“选项,如图。三、接着找到”微信“一项并点击进入,如图。四、最后点击”清除数据“和”清除缓存“即可。
有没有C语言大神,给我讲讲这个程序怎么运行?一步步详细分析一下,拜托...
输出结果如下:第一行的数字相当于标尺,表示第几个字符位,为方便后续说明 c表示输出一个字符,分别对应输出c1,c2,c3,c4和c5 '\\101'表示八进制101即十进制65对应的ASCII字符,为'A',所以c4='A''\\116'表示八进制116即十进制78对应的ASCII字符,为'N',所以c5='N''\\t'表示水平制表符Tab,...