换个思维,4个变量都应0,1两个数,总共有16中可能,可以看成是0-15的二进制码,这样就很好输出啊! 下面是我写的一个程序,不知道能不能满足楼主的需求,程序如下: public class Main { public static void main(String[] args) { int[] p = new int[16]; int[] q = new int[16]; int[] r = new int[16]; int[] s = new int[16];
简短代码,贴上:public class Binary { public static void main(String[] args) { for (int i = 0; i < 16; i++) { int n = i; Stack<Integer> stack = new Stack<Integer>(); while (n != 0) { stack.push(n % 2); n = n / 2; } int[] temp = new int[4]; int sum = stack.size(); for (int k = 0; k < 4 - sum; k++) temp[k] = 0; for (int k = 4 - sum; k < 4; k++) temp[k] = stack.pop(); for (int k = 0; k < 3; k++) System.out.print(temp[k] + "+"); System.out.println(temp[3]); } } } 运行结果: 0+0+0+0 0+0+0+1 0+0+1+0 0+0+1+1 0+1+0+0 0+1+0+1 0+1+1+0 0+1+1+1 1+0+0+0 1+0+0+1 1+0+1+0 1+0+1+1 1+1+0+0 1+1+0+1 1+1+1+0 1+1+1+1
这段代码比上段代码简洁点:public class Binary { public static void main(String[] args) { for (int i = 0; i < 16; i++) { String str = Integer.toBinaryString(i); char[] temp = new char[4]; int sum = str.length(); for (int k = 0; k < 4 - sum; k++) temp[k] = '0'; for (int k = 4 - sum, j = 0; k < 4; k++) temp[k] = str.charAt(j++); for (int k = 0; k < 3; k++) System.out.print(temp[k] + "+"); System.out.println(temp[3]); } } }
弱弱的问一句:可以用四个嵌套for循环吗?
我也想了一个,不过可能楼主不是单纯的要输出这样的结果吧? public class test2 { public static void main(String[] args) { int p=0,q=0,r=0,s=0,i=1; while(i<16){ s = i%2; if (s==0) r=r+1; if (r==2){ r=0; q=q+1; } if (q==2){ q=0; p=p+1; } System.out.println(p+"+"+q+"+"+r+"+"+s); i++; } } }
package csdn.javase.other.ex1;import java.util.ArrayList;
import java.util.List;public class Test2 {
public static void main(String args[]){
StringBuilder byteNum = new StringBuilder(); List<String> operator = new ArrayList();
operator.add("p");
operator.add("q");
operator.add("r");
operator.add("s");
String c="[a-z]";
for(int j=0;j < (int)Math.pow(2,4); j++){
String bit=Integer.toBinaryString(j);
List<String> ex = new ArrayList();
ex.add("p");
ex.add("+");
ex.add("q");
ex.add("+");
ex.add("r");
ex.add("+");
ex.add("s");
if(bit.length() <= 4){//你这里写少了个等号,以至于0111后面的二进制无法产生
StringBuffer transSB = new StringBuffer("");
for(int k=0;k<(4 - bit.length());k++){
transSB.append("0");
}
transSB.append(bit);
bit=transSB.toString();
System.out.println(bit);
}
//将式子中的字母用0,1替代掉 (这块有错误!)
for(int i=0;i < ex.size();i++){
if(ex.get(i).matches(c)){
for(int k=0;k < operator.size();k++){
if(ex.get(i).equals(operator.get(k))){
ex.set(i,String.valueOf(bit.charAt(k)));
continue;
}
}
}
}
for(int i=0;i<ex.size();i++){
System.out.print(ex.get(i));
}
System.out.println("\n");
}
}
}
你出错的原因:你的链表第一次已经被改成了0+0+0+0了,所以你在后面无法再匹配字母了,这就是为什么第一次能够替换成0+0+0+0而后面不能替换成其他数字的原因
if(bit.length() < 4)也是可以的
下面是我写的一个程序,不知道能不能满足楼主的需求,程序如下:
public class Main {
public static void main(String[] args) {
int[] p = new int[16];
int[] q = new int[16];
int[] r = new int[16];
int[] s = new int[16];
//总共有16种组合,也就是0-15的二进制位
String temp;
int len = 0;
for(int i=0; i<p.length; i++) {
temp = Integer.toBinaryString(i);
// 在位数小于4的前面补0
len = temp.length();
for(int j=0; j<4-len; j++) {
temp = "0" + temp;
}
//因为0的ascii编码为48,相减的结果就是数字0-9
p[i] = temp.charAt(0) - 48;
q[i] = temp.charAt(1) - 48;
r[i] = temp.charAt(2) - 48;
s[i] = temp.charAt(3) - 48;
}
//输出结果
for(int i=0; i<p.length; i++) {
System.out.println(p[i] + "+" + q[i] + "+" + r[i] + "+" + s[i]);
}
}
}输出结果是:
0+0+0+0
0+0+0+1
0+0+1+0
0+0+1+1
0+1+0+0
0+1+0+1
0+1+1+0
0+1+1+1
1+0+0+0
1+0+0+1
1+0+1+0
1+0+1+1
1+1+0+0
1+1+0+1
1+1+1+0
1+1+1+1
public static void main(String[] args) {
for (int i = 0; i < 16; i++) {
int n = i;
Stack<Integer> stack = new Stack<Integer>();
while (n != 0) {
stack.push(n % 2);
n = n / 2;
}
int[] temp = new int[4];
int sum = stack.size();
for (int k = 0; k < 4 - sum; k++)
temp[k] = 0;
for (int k = 4 - sum; k < 4; k++)
temp[k] = stack.pop();
for (int k = 0; k < 3; k++)
System.out.print(temp[k] + "+");
System.out.println(temp[3]);
}
}
}
运行结果:
0+0+0+0
0+0+0+1
0+0+1+0
0+0+1+1
0+1+0+0
0+1+0+1
0+1+1+0
0+1+1+1
1+0+0+0
1+0+0+1
1+0+1+0
1+0+1+1
1+1+0+0
1+1+0+1
1+1+1+0
1+1+1+1
public static void main(String[] args) {
for (int i = 0; i < 16; i++) {
String str = Integer.toBinaryString(i);
char[] temp = new char[4];
int sum = str.length();
for (int k = 0; k < 4 - sum; k++)
temp[k] = '0';
for (int k = 4 - sum, j = 0; k < 4; k++)
temp[k] = str.charAt(j++);
for (int k = 0; k < 3; k++)
System.out.print(temp[k] + "+");
System.out.println(temp[3]);
}
}
}
public class test2 {
public static void main(String[] args) {
int p=0,q=0,r=0,s=0,i=1;
while(i<16){
s = i%2;
if (s==0)
r=r+1;
if (r==2){
r=0;
q=q+1;
}
if (q==2){
q=0;
p=p+1;
}
System.out.println(p+"+"+q+"+"+r+"+"+s);
i++;
}
}
}
其他楼的还没试呢,谢谢大家了,慢慢研究大家的方法
下面这个也是要输出一样要求的结果 怎么不行呢?
结果是输出了p+q+s+r八次 大家研究研究呀
public class test4 { /**
* @param args
*/
public static void replace(ArrayList<String> operator){
//Stacks stack=new Stacks();
//扫描表达式中字母并存入数组letter中
StringBuffer byteNum=new StringBuffer();
String s="[a-z]";
ArrayList<String> letter=new ArrayList();
//StringTokenizer t=new StringTokenizer(operator,s,true);
for(int i=0;i<operator.size();i++){
if(operator.get(i).matches(s)&&!letter.contains(operator.get(i))){
letter.add(operator.get(i)) ;
}
}
int times=letter.size();//字母的个数
for(int j=0;j<(int)Math.pow(2, times);j++){
String bit=Integer.toBinaryString(j);
//存储二进制数,位数不足字母个数时,前面补0
for(int k=0;k<(times-bit.length());k++){
byteNum.append("0");
}
byteNum.append(bit);
//将operator中的字母用byteNum中的0,1替代
// int ps=0;
for(int p=0;p<operator.size();p++){
if(operator.get(p).equals(s)){
for(int i=0;i<letter.size();i++){
if(operator.get(p).equals(letter.get(i))){
operator.set(p, String.valueOf(byteNum.charAt(i)) );
}
}
}
}
for(int m=0;m<operator.size();m++){
System.out.print(operator.get(m));
}
}
}
public static void main(String args[]){
ArrayList<String> put=new ArrayList<String>();
put.add("p");
put.add("+");
put.add("q");
put.add("+");
put.add("s");
put.add("+");
put.add("r");
Operation.replace(put);
}
}
在ex.add("s");之后加上:
ArrayList<String> ex_back = (ArrayList<String>) ex.clone();在for (int i = 0; i < ex.size(); i++) {
System.out.print(ex.get(i));
}
之后加上:
ex.clear();ex = (ArrayList<String>) ex_back.clone();
出错原因如2楼。
这种做法在内存上比较浪费,但最为贴合你的原始代码。
代码:
public class test1{
public static void main(String[] args) {
test1 t = new test1();
System.out.println("Output:p+r+s+q");
t.run("p+r+s+q");
System.out.println("---------------");
System.out.println("Output:prsq");
t.run("prsq");
}
public void run(String pattern) {
char[] chars = pattern.toCharArray();
int outputCount = 0;
for(int i = 0; i < chars.length; i ++) {
if(chars[i] != '+')
outputCount ++;
}
String outputFormat = pattern.replaceAll("[pqrs]", "%s");
for(int i = 0; i < outputCount * outputCount; i ++) {
String mask = String.format("%" + outputCount + "s", Integer.toBinaryString(i)).replaceAll(" ", "0"); System.out.println(String.format(outputFormat, getChars(mask)));
}
}
private Object[] getChars(String mask) {
Object[] objs = new Object[mask.length()];
for(int i = 0; i < mask.length(); i ++) {
objs[i] = mask.charAt(i);
}
return objs;
}
}输出:Output:p+r+s+q
0+0+0+0
0+0+0+1
0+0+1+0
0+0+1+1
0+1+0+0
0+1+0+1
0+1+1+0
0+1+1+1
1+0+0+0
1+0+0+1
1+0+1+0
1+0+1+1
1+1+0+0
1+1+0+1
1+1+1+0
1+1+1+1
---------------
Output:prsq
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111