论坛首页 Java企业应用论坛

是否很久没抽象和逻辑了呢? DODO它吧(很基础)一

浏览 5619 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (12) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-06-07   最后修改:2010-06-07

1. 线程问题。
   设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。

2. 数字转化问题。
   将一个键盘输入的数字转化成中文输出(例如:输入:1234567     输出:一百二拾三万四千五百六拾七)。

3. 全排列问题。
  输出自然数1~n的所有不重复的排列, 即n的全排列。

4. 不全排列问题(不重复)。
   给定n(1<=n<=500)以及待排列的n个元素。计算出这n个元素的所有不同排列。
   比如
   input: 4 aacc
   output: aacc acac acca caac caca ccaa 6

5. 大整数问题。
   编程求档N<=100时,N!的准确值。

6. n阶魔方阵问题。
   n阶魔方是指这样一种方阵,它的每一行、每一列以及对角线上的各数之和为一个相同的常数.
   编程求解n(n<=100)为奇数的魔方阵.

7. 填写运算符问题。
   输入任意六个数x1,x2,x3,x4,x5和y,在前五个每相邻数之间填上一个运算符("+", "-", "*", "/")。使得计算出来的值等于y。

 

   发表时间: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();
	}

}
0 请登录后投票
   发表时间: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;
	}

}
0 请登录后投票
   发表时间: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"));
}
}
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2010-06-07  
刚上来就看到啦 非常好 非常适合我 感谢楼主
0 请登录后投票
   发表时间:2010-06-07  
游客飘过!!!!
0 请登录后投票
   发表时间:2010-06-08  
每次看都有不清楚的
什么时候真正senior啊
0 请登录后投票
   发表时间:2010-06-08  
学习,小弟才学编程
0 请登录后投票
   发表时间:2010-06-08  
其实是要花点时间做的,不知道高手做这个花多长时间?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics