1.金额转换问题
答案:
public class RenMingBi {
/**
* @param args add by zxx ,Nov 29, 2008
*/
private static final char[] data = new char[]{
'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
};
private static final char[] units = new char[]{
'元','拾','佰','仟','万','拾','佰','仟','亿'
};
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(
convert(135689123));
}
public static String convert(int money)
{
StringBuffer sbf = new StringBuffer();
int unit = 0;
while(money!=0)
{
sbf.insert(0,units[unit++]);
int number = money%10;
sbf.insert(0, data[number]);
money /= 10;
}
return sbf.toString();
}
}
2.阶乘后连续 0 个数问题
答案:10 = 2 * 5。每一个 2 与一个 5 相乘,结果就增加一个零。所以求 n! 后面的连续
零的个数,其实就是求其中相乘的数含有因子每对因子 2 与 5 的个数。又因为从 1 到某
个数,所含 2 的个数比 5 多,所以问题就可以进一步简化到求含有因子 5 的个数。
JAVA 实现代码如下:
static int zeroCount ( int n) {
int counter = 0;
for( int i = 5,m; i <= n; i += 5) {
m = i;
while ( m % 5 == 0) {
counter++;
m /= 5;
}
}
return counter;
}
进一步优化算法:
static int zeroCount ( int n) {
int counter = 0;
while ( n >= 5) {
n /= 5;
counter += n;
}
return counter;
}
3.质数问题
答案:
public static void main(String[] args){
Random rd = new Random(); //定义一个随机变量
int i = rd.nextInt(1000); //获取个随机数
System.out.println(isNum(i)); //输出结果
}
public static String isNum(int i ){
String ret =i+"是质数"; //默认是质数
if(i==2)
return ret; //如果是 2 返回默认结果
for (int j = 2; j < i/2; j++) { //制订循环次数
if(i%j==0){
ret=i+"不是质数"; // 如果能够整除返回不是质数
break;
}
}
return ret; //返回结果
}
4.数字黑洞问题(尚未解决哦)
问题:有任意一个 5 位数,如:34256,把它的各位数字打乱,重新排列,就可得到一个最
大的数:65432,还有一个最小的数 23456。求这两个数字的差,得:41976,然后把这个
数字再次重复上述过程(如果不足 5 位,则前边补 0)。如此往复,数字会落入某个循环圈
(称为数字黑洞)。比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到 5 位数所有可能的循环圈,并输出,每个循环圈占 1 行。其中 5 位
数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:[82962, 75933,
63954, 61974],其中数字的先后顺序可以不考虑。
5.百鸡问题
问题:3 文钱可以买 1 只公鸡,2 文钱可以买一只母鸡 1 文钱可以买文钱可以买 3 只小鸡。
用 100 文 钱买 100 只鸡,那么各有公鸡母鸡小鸡多少只?
答案:遍历的时候当公鸡 母鸡 小鸡的价格总和操作 100 文的时 后面就可以不再遍历了
例如当公鸡 a= 20 的时候 母鸡 b 肯定<=20 20*3(公鸡的价格总和)+20*2(母鸡的价
格总和)+小鸡的价格总和 >=100,这个时候循环就可以终止了,但是循环条件里面是
for(int b = 0; b<=50; b++),所以对于 20<b<=50 这个取值区间没有必要在进行遍历了。
for(int a = 0; a<=33; a++){//最多 33 只公鸡
for(int b = 0; b<=50; b++){//最多 50 只母鸡
int c = 100 - a - b; //c 只小鸡
if((a*3 + b*2 + c/3 == 100) && c%3 == 0 ){
System.out.println(a + "只公鸡," + b + "只母鸡," + c + "只小鸡");
}
if(a*3 + b*2 + c/3 > 100) break;
}
}
6.1~1000 累乘后面有多少个零问题
答案:
public static void main(String[] args) {
BigInteger bi = new BigInteger("1");//初始化值为 1
for(int i=2;i<1001;i++){
bi=bi.multiply(BigInteger.valueOf(i));//这里是做乘法运算
}
int N=0;
String s=bi.toString();//结果转化为字符串
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='0'){
N++;//有一个 0 就加上 1
}
}
System.out.println("1000!中共有 0 的个数为:"+N);
}
7.猴子分桃问题(尚未解决哦)
问题:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,
这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又
多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做
的,问海滩上原来最少有多少个桃子?
8.蚂蚁爬木杆问题
问题:有一根 27 厘米的细木杆,在第 3 厘米、7 厘米、11 厘米、17 厘米、23 厘米这五个
位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始 时,蚂蚁的头朝左还是朝
右是任意的,它们只会朝前走或调头, 但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会
同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离
开木杆 的最小时间和最大时间。
9.螺旋矩阵问题
问题: 输出 n=5 的螺旋方阵
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
答案:
public class Main{
public static void main(String[] args) {
// 设定参数
final int N = 7;
final int COUNT = 11;
// 初始化
int mat[][] = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
mat[i][j] = 0;
}
}
{// 写入
int i = 0;
int j = 0;
int count = COUNT;
mat[0][0] = count++;
while (count < N * N + COUNT) {
while (j + 1 < N && mat[i][j + 1] == 0) {
mat[i][++j] = count++;
}
while (i + 1 < N && mat[i + 1][j] == 0) {
mat[++i][j] = count++;
}
while (j - 1 >= 0 && mat[i][j - 1] == 0) {
mat[i][--j] = count++;
}
while (i - 1 >= 0 && mat[i - 1][j] == 0) {
mat[--i][j] = count++;
}
}
}
// 输出
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
String out = String.valueOf(mat[i][j]);
String str = " ";
out = str.substring(0, 5 - out.length()) + out;
System.out.print(out);
}
System.out.println();
}
}
}
10.数字转换大小写问题
答案:
public class Test {
public static void main(String[] args) {
// 键盘输入,转换成字符型数组
Scanner sc = new Scanner(System.in);
// 为了提示,我们打印一句"请在键盘上输入一串数字:"
System.out.println("请在键盘上输入一串数字:");
// 接收字符串
String str = sc.nextLine();
// 调用方法.toCharArray();将字符串转译成 char 型数组
char[] num = str.toCharArray();
// 定义数组,将大写的数字也录入数组
char[] China = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };
// 遍历数组
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < China.length; j++) {
// 用 num[i]-'0'得到 China[]脚标并打印相对应的元素
if (num[i] - '0' == j) {
// 根据题目提示,输出时我们不需要换行
System.out.print(China[j]);
}
}
}
}
}
11.数组去除重复问题
答案:
public static void moveSame(int[] arr){
int[] newarr = null;
ArrayList list = new ArrayList();
for(int i : arr){
if(!list.contains(i)){
list.add(i);
}
}
}
12.希尔排序
答案:
public static void xierpaixu(int array[], int length) {// 10
int len = length / 2;
int i, j, temp;
while (len >= 1) {
// 每次都取它的中间下标, 循环的次数等于总长/2,除的次数
for (i = len; i < length; i++) {// 从 5 的下标循环到 9 下标
temp = array[i];// 保存值
j = i - len;// j 是从 0 的下标变换到下标 4
// 0 到 4 的下标,每个值和 temp 比较,交换 j 和 temp 的值
while (j >= 0 && array[j] > temp) {
// 如果 0 下标的值大于中间下标的值
array[j + len] = array[j];// 0 下标的值给中间的角标
j = j - len;// 改变 j 的下标,这时 j 为负数,跳出循环
}
// 把 j 变成 0 的下标,给下标 j 赋值,j 是当前循环时的下标,
array[j + len] = temp;
}
len = len / 2; // 缩小增量
}
for (int a = 0; a < length; a++) {// 遍历数组
System.err.print(array[a] + ",");
}
}