精华帖 (0) :: 良好帖 (0) :: 新手帖 (12) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-07
最后修改:2010-06-07
1. 线程问题。 2. 数字转化问题。 3. 全排列问题。 4. 不全排列问题(不重复)。 5. 大整数问题。 6. n阶魔方阵问题。 7. 填写运算符问题。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-06-07
最后修改:2010-06-07
1. 线程问题。
package thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 1. 线程问题。 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 * * @sincejdk1.6 * @author 毛正吉 * @version 1.0 * @date 2010.06.07 * */ public class ThreadIJTest { /** * @param args */ public static void main(String[] args) { ThreadIJTest tij = new ThreadIJTest(); ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 2; i++) { exec.execute(tij.getIncRunner()); // 执行j++ exec.execute(tij.getDecRunner()); // 执行j-- } exec.shutdown(); } private int j; // 变量j /** * j++ */ private synchronized void incJ() { j++; System.out.println(Thread.currentThread().getName() + " inc " + j); } /** * j-- */ private synchronized void decJ() { j--; System.out.println(Thread.currentThread().getName() + " dec " + j); } /** * 内部类:j++线程 * * @author 毛正吉 * */ private class IncRunner implements Runnable { public void run() { for (int i = 0; i < 100; i++) { incJ(); } } } /** * 内部类:j++线程 * * @author 毛正吉 * */ private class DecRunner implements Runnable { public void run() { for (int i = 0; i < 100; i++) { decJ(); } } } /** * 获得内部加线程 * * @return */ public Runnable getIncRunner() { return new IncRunner(); } /** * 获得内部减线程 * * @return */ public Runnable getDecRunner() { return new DecRunner(); } } |
|
返回顶楼 | |
发表时间:2010-06-07
最后修改:2010-06-07
3. 全排列问题。
package abstractandlogic; /** * 3. 全排列问题。 输出自然数1~n的所有不重复的排列, 即n的全排列。 * * @sincejdk1.6 * @author 毛正吉 * @version 1.0 * @date 2010.06.07 * */ public class NAllArray { /** * @param args */ public static void main(String[] args) { int n = 6; NAllArray na = new NAllArray(n); na.backtrace(1); // 回溯搜索输出n的全排列 int s = na.getS(); System.out.println("s = " + s); } private int n; // 整数n private int[] a; // n的全排列解空间 private int s; // 总数 /** * 构造 * * @param _n */ public NAllArray(int _n) { n = _n; a = new int[n + 1]; a[0] = 0; for (int i = 1; i <= n; i++) { a[i] = i; } s = 0; } /** * 回溯搜索 * * @param t */ public void backtrace(int t) { if (t == n) { output(); } else { for (int j = t; j <= n; j++) { swap(t, j); backtrace(t + 1); // 回溯 swap(t, j); } } } /** * 交换 * * @param t * @param j */ private void swap(int t, int j) { int temp = a[t]; a[t] = a[j]; a[j] = temp; } /** * 输出 */ private void output() { for (int i = 1; i <= n; i++) { System.out.print(a[i] + " "); } System.out.println(""); s++; } /** * 获得总数s * * @return */ public int getS() { return s; } } |
|
返回顶楼 | |
发表时间:2010-06-07
import java.text.DecimalFormat;
/** * * 项目名称:PMS * 类名称:ChnAmt * 类描述:数字转化为中文 * 创建人:Owner * 创建时间:2009-8-3 上午09:44:13 * 修改人:Owner * 修改时间:2009-8-3 上午09:44:13 * 修改备注: * @version * */ public class DataConvert { private String[] saChnAmount = new String[50]; private int iArrayLen = 0; private int iArrayPos = 0; /** * * 创建一个新的实例 DataConvert(构造-小写金额转换大写对象(不带参)). * * @param sAmount */ public DataConvert(String sAmount) { int iDecFrac = 0; if (sAmount.indexOf(".") != -1) { iDecFrac = sAmount.length() - sAmount.indexOf("."); if (iDecFrac > 3) { iDecFrac = 3; } sAmount = sAmount.substring(0, sAmount.indexOf("."))+ sAmount.substring(sAmount.indexOf(".") + 1, sAmount.indexOf(".")+ iDecFrac); for (; iDecFrac < 3; iDecFrac++) { sAmount += "0"; } } else { sAmount += "00"; } toChnAmt(sAmount, 2, false); } /** * * 创建一个新的实例 DataConvert(构造-小写金额转换大写对象(带参)). * * @param sAmount * @param iDec * @param bDot */ public DataConvert(String sAmount, int iDec, boolean bDot) { if (bDot) { if (sAmount.indexOf(".") < 0) { // 没有小数点 sAmount += "."; for (int iFor = iDec; iFor > 0; iFor--) { sAmount += "0"; } } else { int iDecLen = sAmount.length() - sAmount.indexOf(".") - 1; if (iDecLen > iDec) { // 去位 sAmount = sAmount.substring(0, sAmount.indexOf(".") + iDec + 1); } else if (iDecLen < iDec) { // 补零 for (int iFor = iDec - iDecLen; iFor > 0; iFor--) { sAmount += "0"; } } } } toChnAmt(sAmount, iDec, bDot); } /** * * toChnAmt(小写金额转换大写) * @param sAmount * @param iDec * @param bDot * @return void * @since CodingExample Ver(编码范例查看) 1.1 */ public void toChnAmt( String sAmount, int iDec, boolean bDot ) { // 数字 final String [] sUserCode = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; // 单位 final String [] sChnUnit = { "厘","分","角","元","十","百","千","万","十","百","千","亿","十","百","千","万"}; // 整 final String sSpecEnd = "整"; // 标志 // '9'代表十 // '3' - '元', '1' - '万'( 如遇前一生成字符为'亿',则不生成'万' ), '3' - '亿' // '0' - 其他 final byte [] byFlag = { 0, 0, 0, 3, 9, 0, 0, 1, 9, 0, 0, 3, 9, 0, 0, 0 }; int iCounter, iPos; byte byPreFlag=-1; char cDigit, cPreDigit=' '; iArrayLen = 0; switch ( iDec ) { // 补零 case 0: sAmount += "0"; case 1: sAmount += "0"; case 2: sAmount += "0"; case 3: break; default: sAmount = sAmount.substring(0,sAmount.length()-iDec + 3) ; } if ( bDot ) { // 转换小数点 sAmount = sAmount.substring(0,sAmount.length()-4 ) + sAmount.substring(sAmount.length()-3 ); } // 开始转换 for( iCounter=sAmount.length() ; iCounter>0; iCounter--) { // 计算数字位置 iPos = sAmount.length() - iCounter; // 获得数字字符 cDigit = sAmount.charAt(iPos); // 过滤数字 if ( cDigit<'0' || cDigit>'9' ) cDigit = '0'; if ( cDigit != '0' ) { // 当前数字不为'0' if ( cPreDigit == '0' ) { // 前一数字为'0' if ( byPreFlag != 3 && byPreFlag != 1 ) { // '亿','万','元' 后不加 '零' saChnAmount[ ++iArrayLen ] = sUserCode[ 0 ]; } } if ( cDigit =='1' && byFlag[iCounter-1] == 9 && iArrayLen == 0 ) { // 数字为'1',单位为'十',且为第一个数字时,不报'1',只报'十' saChnAmount[ ++iArrayLen ] = sChnUnit[ iCounter - 1 ]; } else { // 生成数字 saChnAmount[ ++iArrayLen ] = sUserCode[ Character.digit( cDigit, 10 ) ]; // 生成单位 saChnAmount[ ++iArrayLen ] = sChnUnit[ iCounter - 1 ]; // 记录当前位标志 byPreFlag = byFlag[iCounter-1]; } } else { // 数字为'0' if ( iArrayLen == 0 ) { // 过滤首位'0' continue; } else { if ( byFlag[iCounter-1] == 3 || ( byFlag[iCounter-1]==1 && byPreFlag!=3 && !saChnAmount[ iArrayLen ].equals( sChnUnit[ 11 ] ) ) ) { // 生成'亿','万','元'的单位,但如果从'千万'位到'万'位都为0,则不生成'万' saChnAmount[ ++iArrayLen ] = sChnUnit[ iCounter - 1 ]; } // 记录当前位标志 byPreFlag = byFlag[iCounter-1]; } } // 记录当前数字 cPreDigit = cDigit; } if ( iArrayLen == 0 ) { // 转换结束数组长度为0,生成'0元整' saChnAmount[ ++iArrayLen ] = sUserCode[ 0 ]; saChnAmount[ ++iArrayLen ] = sChnUnit[ 3 ]; saChnAmount[ ++iArrayLen ] = sSpecEnd; } if ( saChnAmount[ iArrayLen ].equals( sChnUnit[ 3 ] ) ) { // 最后位为'元',加上'整' saChnAmount[ ++iArrayLen ] = sSpecEnd; } } /** * * next(判断是否还有下一个转换元素) * @return String DOM对象 * @since CodingExample Ver(编码范例查看) 1.1 */ public boolean next() { boolean bRtn = false; if (iArrayPos++ < iArrayLen) { bRtn = true; } return bRtn; } /** * * getResult(获取当前转换元素) * @return String * @since CodingExample Ver(编码范例查看) 1.1 */ public String getResult() { String sRtn = ""; sRtn = saChnAmount[iArrayPos]; return sRtn; } /** * * DoubleToString(转换double到String型) * @param dMoney * @return String * @since CodingExample Ver(编码范例查看) 1.1 */ public static String DoubleToString(double dMoney) { String sMoney = ""; DecimalFormat df = new DecimalFormat("############.###"); try { sMoney = df.format(dMoney); } catch (Exception e) { sMoney = ""; } return sMoney; } /** * * getChinaData(字符串形式的数字大写取得) * @param data * @return String 返回数字的大写中文读法 * @since CodingExample Ver(编码范例查看) 1.1 */ public static String getChinaData(String data){ StringBuffer sb = new StringBuffer(); DataConvert chnAMT; chnAMT = new DataConvert(data); while (chnAMT.next()) { sb.append(chnAMT.getResult()); } return sb.toString(); } public static void main(String[] str) { System.out.println(DataConvert.getChinaData("8744.11")); } } |
|
返回顶楼 | |
发表时间:2010-06-07
最后修改:2010-06-07
4. 不全排列问题(不重复)。
package abstractandlogic; /** * 4. 不全排列问题(不重复)。 给定n(1<=n<=500)以及待排列的n个元素。计算出这n个元素的所有不同排列。 比如 input: 4 aacc * output: aacc acac acca caac caca ccaa 6 * * @sincejdk1.6 * @author 毛正吉 * @version 1.0 * @date 2010.06.07 * */ public class NAllUniqueArray { /** * @param args */ public static void main(String[] args) { char[] ch = "aacc".toCharArray(); NAllUniqueArray nua = new NAllUniqueArray(ch); nua.backtrace(1); int s = nua.getS(); System.out.println("s = " + s); } private char[] ch; // 向量空间 private int n; // 长度 private int s; // 总数 /** * 构造方法 * * @param _ch */ public NAllUniqueArray(char[] _ch) { int len = _ch.length; n = len; ch = new char[len + 1]; for (int i = 1; i <= len; i++) { ch[i] = _ch[i - 1]; } s = 0; } /** * 回溯搜索 * * @param t */ public void backtrace(int t) { if (t == n) { output(); } else { for (int j = t; j <= n; j++) { if (checkUnique(t, j)) { swap(t, j); backtrace(t + 1); // 回溯 swap(t, j); } } } } /** * 检查唯一性 * * @param t * @param j * @return */ public boolean checkUnique(int t, int j) { for (int i = t; i < j; i++) { if (ch[i] == ch[j]) { return false; } } return true; } /** * 交换 * * @param t * @param j */ private void swap(int t, int j) { char temp = ch[t]; ch[t] = ch[j]; ch[j] = temp; } /** * 输出 */ private void output() { for (int i = 1; i <= n; i++) { System.out.print(ch[i] + " "); } System.out.println(""); s++; } /** * 获得总数s * * @return */ public int getS() { return s; } } 输出: a a c c a c a c a c c a c a a c c a c a c c a a s = 6 |
|
返回顶楼 | |
发表时间:2010-06-07
刚上来就看到啦 非常好 非常适合我 感谢楼主
|
|
返回顶楼 | |
发表时间:2010-06-07
游客飘过!!!!
|
|
返回顶楼 | |
发表时间:2010-06-08
每次看都有不清楚的
什么时候真正senior啊 |
|
返回顶楼 | |
发表时间:2010-06-08
学习,小弟才学编程
|
|
返回顶楼 | |
发表时间:2010-06-08
其实是要花点时间做的,不知道高手做这个花多长时间?
|
|
返回顶楼 | |