一、QiPan.java利用二维数组和循环语句绘制五子棋盘。
定义二维数组作为棋盘,利用数组大小设置棋盘大小,电脑随机生成两个随机数作为下子的坐标,玩家输入两个数作为坐标,数字不能超出棋盘的范围,循环直到一方胜利。
二、整数转换为汉字。
package demo;
import javax.swing.*;
import java.util.Scanner;
public class Changeint {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Changeint t2r = new Changeint();
String s = t2r.cleanZero(t2r.numFormat((t2r.getNum())));
// 如果转换过后是一个空串,则不输出屏幕
if(!"".equals(s)) {
System.out.println("转换成中文后为:" + s);
}
}
private String getNum() {
String s = null;
System.out.println("请输入一个整数(非负数):");
// 从命令行输入这个数
Scanner scan = new Scanner(System.in);
s = scan.next();
scan.close();
return s;
}
private String numFormat( String s) {
int sLength = s.length();
// 货币大写形式
String bigLetter[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
// 货币单位
String unit[] = {" ", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", "万"};
// 用来存放转换后的新字符串
String newS = "";
// 逐位替换为中文大写形式
for(int i = 0; i < sLength; i ++) {
newS = newS + bigLetter[s.charAt(i) - 48] + unit[sLength - i - 1];
}
return newS;
}
private String cleanZero(String s) {
// 如果传入的是空串则继续返回空串
if("".equals(s)) {
return "";
}
// 如果用户开始输入了很多 0 去掉字符串前面多余的'零',使其看上去更符合习惯
while(s.charAt(0) == '零') {
// 将字符串中的 "零" 和它对应的单位去掉
s = s.substring(2);
// 如果用户当初输入的时候只输入了 0,则只返回一个 "零"
if(s.length() == 0) {
return "零";
}
}
// 字符串中存在多个'零'在一起的时候只读出一个'零',并省略多余的单位
String regex1[] = {"零千", "零百", "零十"};
String regex2[] = {"零亿", "零万"};
String regex3[] = {"亿", "万"};
// 第一轮转换把 "零仟", 零佰","零拾"等字符串替换成一个"零"
for(int i = 0; i < 3; i ++) {
s = s.replaceAll(regex1[i], "零");
}
// 第二轮转换考虑 "零亿","零万","零元"等情况
// "亿","万","元"这些单位有些情况是不能省的,需要保留下来
for(int i = 0; i < 2; i ++) {
// 当第一轮转换过后有可能有很多个零叠在一起
// 要把很多个重复的零变成一个零
s = s.replaceAll("零零零", "零");
s = s.replaceAll("零零", "零");
s = s.replaceAll(regex2[i], regex3[i]);
}
// 当"万"到"亿"之间全部是"零"的时候,忽略"亿万"单位,只保留一个"亿"
s = s.replaceAll("亿万", "亿");
return s;
}
}
结果截图
三、大数计算
import java.util.Scanner;
public class Bignum {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String n1,n2;
Scanner in=new Scanner(System.in);
System.out.println("请输入第一个大数:");
n1=in.next();
System.out.println("请输入第二个大数:");
n2=in.next();
System.out.println(add(n1,n2));
System.out.println(sub(n1,n2));
in.close();
}
private static String add(String a, String b)
{
System.out.print("加法结果:");
char[] aa = new StringBuffer(a).reverse().toString().toCharArray();
char[] bb = new StringBuffer(b).reverse().toString().toCharArray();
int aLen = aa.length;
int bLen = bb.length;
int len = aLen > bLen ? aLen : bLen;
int[] result = new int[len + 1];
for (int i = 0; i < len + 1; ++i) {
int aint = i < aLen ? aa[i] - '0' : 0;
int bint = i < bLen ? bb[i] - '0' : 0;
result[i] = aint + bint;
}
for(int i=0;i<result.length-1;++i){
if(result[i]>=10){
result[i+1] += result[i]/10;
result[i] %= 10;
}
}
boolean flag = true;
StringBuffer sb = new StringBuffer(len);
for(int i=len;i>=0;--i){
if(result[i]==0&&flag){
continue;
}
else{
flag=false;
}
sb.append(result[i]);
}
return sb.toString();
}
public static String sub(String f, String s) {
System.out.print("减法结果:");
// 将字符串翻转并转换成字符数组
char[] a = new StringBuffer(f).reverse().toString().toCharArray();
char[] b = new StringBuffer(s).reverse().toString().toCharArray();
int lenA = a.length;
int lenB = b.length;
// 找到最大长度
int len = lenA > lenB ? lenA : lenB;
int[] result = new int[len];
// 表示结果的正负
char sign = '+';
// 判断最终结果的正负
if (lenA < lenB) {
sign = '-';
}
else if (lenA == lenB) {
int i = lenA - 1;
while (i > 0 && a[i] == b[i]) {
i--;
}
if (a[i] < b[i]) {
sign = '-';
}
}
// 计算结果集,如果最终结果为正,那么就a-b否则的话就b-a
for (int i = 0; i < len; i++) {
int aint = i < lenA ? (a[i] - '0') : 0;
int bint = i < lenB ? (b[i] - '0') : 0;
if (sign == '+') {
result[i] = aint - bint;
}
else {
result[i] = bint - aint;
}
}
// 如果结果集合中的某一位小于零,那么就向前一位借一,然后将本位加上10。其实就相当于借位做减法
for (int i = 0; i < result.length - 1; i++) {
if (result[i] < 0) {
result[i + 1] -= 1;
result[i] += 10;
}
}
StringBuffer sb = new StringBuffer();
// 如果最终结果为负值,就将负号放在最前面,正号则不需要
if (sign == '-') {
sb.append('-');
}
// 判断是否有前置0
boolean flag = true;
for (int i = len - 1; i >= 0; i--) {
if (result[i] == 0 && flag) {
continue;
}
else {
flag = false;
}
sb.append(result[i]);
}
// 如果最终结果集合中没有值,就说明是两值相等,最终返回0
if (sb.toString().equals("")) {
sb.append("0");
}
// 返回值
System.out.println(sb.toString());
return "";
}
}
结果截图
阅读BigInteger类源码,弄清楚它是使用什么算法实现加减乘除四种运算的?
BigInteger:支持任意精度的整数,可以精确地表示任意大小的整数值,同时在运算过程中不会丢失任何信息。所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
四 、随机数
(1)设计思路
先定义一个长度为10的数组,随机生成数字,循环给数组元素赋值,在计算数组元素的和最后输出。
(2)程序流程图
(3)源代码
import javax.swing.JOptionPane;
public class Number {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = new int[10];
int num=0;
String output=" ";
for(int i=0;i<10;i++){
arr[i] = (int)(Math.random()*10);
}
output+="十个元素为:"+"
";
for(int i=0;i<10;i++)
{
output+=arr[i]+" ";
num=num+arr[i];
}
output+="
";
output+="十个元素相加结果为:"+"
";
output+=num;
JOptionPane.showMessageDialog( null,output, "数组",JOptionPane.PLAIN_MESSAGE);
}
}
(4)截图