在校園網的論壇上看到的一些題目
放假了沒有什麼事做就想到了自己來試著做一些
到今天 才總是把它給做成了我想要實現的結果了
有時候就是那樣
做了好久
都沒辦法做出來
到靈感來了的那一下
一下子就可以做出來
心裡有點高興
在這個過程中
我對JAVA的IO了解得比以前多了一點
雖然還不是很熟悉
但大概也知道怎麼用了
如下
給定等式 A B C D E 其中每個字母代表一個數字
且不同數字對應不
D F G 同字母
編程求出這些數字並且打出這個數字的
+ D F G 算術計算豎式
───────
語句
X Y Z D E
下面是我自己的JAVA代碼
裡面有很大一段是人家寫的
個數的全排列
我只是把修改成了JAVA

import java
io
*;


public class PaiLei
{

static int count=
;


private char[] symbol=
{
A
B
C
D
E
F
G
X
Y
Z
} ;


int [] num=
{
};


public void check()
{

//System
out
print(
進來了呀
);

//temp
表示數字ABCDE

int temp
=num[
]*
+num[
]*
+num[
]*
+num[
]*
+num[
];

//temp
表示數字DFG

int temp
=num[
]*
+num[
]*
+num[
];

//temp
表示數字XYZDE

int temp
=num[
]*
+num[
]*
+num[
]*
+num[
]*
+num[
];

//判斷表達式是不是成立

//System
out
print(
進入循環
);



if((temp
+temp
*
)==temp
)
{

count++;

System
out
println(temp
+temp
+temp
);

System
out
println(temp
);

System
out
println(
第
+count+
種答案
);

print();

}

}

//function方法是核心方法
就是求
個數的全排列


/** *//**

例
:將
到N的N個自然數排成一列
共有
*
*
……*N種不同的排列方法
如

N=
時
有
種排列方案
分別為
試編程序輸出

到N的全部排列
假設N<
為了設計出由計算機輸出
到N的全部排列程序

就必須尋找不同排列之間的規律
通過觀察N=
(參見本例的運行結果)的排

列情況
可以發現
如果把每個排列看作一個自然數
則所有排列對應的數是

按從小到大的順序排列
從當前的排列產生下一個排列時必然會造成某一 位

置上的數字變大
這一位置顯然應該盡量靠右
並且在它左邊位置上的數字保

持不變
這就意味著這一位置變成的數字來自於它的右邊
並且變大的幅度

要盡可能小
也就是說在它右邊如有幾個 數同時比它大時
應該用其中最小的

來代替它
由於這一位置是滿足上述條件的最右邊的一位
所以在它右邊的所

有數字按逆序排列
即在這些數字的右邊沒有一個大於它的數
程序中先從右

至左找到第一個位置
該位置上的數比它右邊的數小
這個位置就是所要找的

滿足上述條件的位置
然後再從右到左找到第一個比該位置上的數字大的數

字所在的位置
將這兩個位置上的數字交換
再將該位置右邊的所有元素顛倒

過來
即將它們按從小到大的順序排列
就得到了下一個排列

結果應該是

Input n:

#include<iostream>

using namespace std;

void main(){

int n; //n個數字的排列;

cout<<
input:
;

cin>>n;

int *p=new int[n]; //數組保存各位數字;

for(int i=
;i<n;i++) //初始化為第一個排列;

p[i]=i+
;

do{

for(i=
;i<n;i++) //輸出排列中的數字

cout<<p[i]<<
;

cout<<endl;

for(int j=n
;j>
;j
) //從右向左;找要交換的位置
(j);

if(p[j]>p[j
]) break;

if(j==
)break; //找不到要交換的位置
退出do

j
;

for(int k=n
;k>j;k
) //在位置
右邊;從右向左;

//找要交換的位置
(k);

if(p[k]>p[j])break;

swap(p[k]
p[j]); //交換位置
和位置
的值;

//把位置
後邊的所有位反序排列;

for(int x=j+
y=n
;x<y;x++
y
)

swap(p[x]
p[y]);

}while(
);

delete []p;

}

*/


public void function()throws IOException
{

int i
temp
j;


do
{

check();

//write();


for(i=
;i>
;i
)
{

if(num[i]>num[i
])

break;

}

if(i==
)

break;

i
;


for(j=
;j>i;j
)
{

if(num[j]>num[i]) break;

}

temp= num[j];

num[j]=num[i];

num[i]=temp;

//下面循環是


for(int x=i+
y=
;x<y;x++
y
)
{

temp=num[x];

num[x]=num[y];

num[y]=temp;

}

}while(true);

}

//輸出正確結果的方法


public void print()
{


for(int j=
;j<=
;j++)
{

//輸出ABCDEFGXYZ

System
out
print(symbol[j]+
);

}

System
out
println();


for(int j=
;j<=
;j++)
{

//輸出他們對應的值

System
out
print(num[j]+
);

}

System
out
println();

System
out
println(
+num[
]+num[
]+num[
]+num[
]+num[
]);

System
out
println(
+num[
]+num[
]+num[
]);

System
out
println(
+
+num[
]+num[
]+num[
]);

System
out
println(
+num[
]+num[
]+num[
]+num[
]+num[
]);

System
out
println();


}

//將所有排列寫入記事本


public void write()throws IOException
{

File myfile=new File(
d:\paiei
txt
);

FileOutputStream out=new FileOutputStream(myfile
true);

DataOutputStream out
=new DataOutputStream(out);


byte[] temp=
{
};


for(byte i=
;i<=
;i++)
{

temp[i]=(byte)num[i]; //num數組是一個int型

out
writeByte(temp[i]+
);

PrintStream out
=new PrintStream(out);

out
print(
);

// out
close();

}

PrintStream out
=new PrintStream(out);

out
println();

// out
close();

//==============下面幾行注釋了的是
向控治台輸出顯示

// ByteArrayInputStream in=new ByteArrayInputStream(temp);

// int data=in
read();

// while(data!=
){

// //out
write(temp);

// System
out
print(
+data);

// data=in
read();

// }

// System
out
print(
);

// in
close();

out
close();

}


public static void main(String [] args) throws IOException
{

PaiLei p=new PaiLei();

p
function();

}

}

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26328.html