前几天在逛论坛的时候,发现一个题目比较有意思,用java实现手算相加,相乘,觉得有意思就写了写。把代码贴上了,大家拍砖。
package string;
import java.math.BigInteger;
public class Add {
/**
* 模拟手算加法
**/
public static String add(String a ,String b){
//最后的结果放入到这个字符串中
StringBuilder result = new StringBuilder("");
try {
String newA = deleteZeroStrng(a);
String newB = deleteZeroStrng(b);
char[] maxChar = newA.length()>=newB.length()?newA.toCharArray():newB.toCharArray();
char[] minChar = newA.length()<newB.length()?newA.toCharArray():newB.toCharArray();;
//求2个数的最大长度和最小长度
int maxLen = maxChar.length;
int minLen = minChar.length;
//进位
int carry = 0;
//最小的长度为循环次数,就是加数
for (int i = 0; i < minLen; i++) {
int sum = maxChar[i]-'0'+minChar[i]-'0'+carry;
result.append(sum%10);
carry = sum/10;
}
//如果位数相等,补一位1
if(minLen==maxLen){
if(carry==1)
result.append(1);
}
//复制多余的位数
else{
for (int i = minLen; i < maxLen; i++) {
int value = maxChar[i]-'0'+carry;
result.append(value%10);
carry = value/10;
}
if(carry!=0){
result.append(carry);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result.reverse().toString();
}
/**
* 模拟手算乘法
*/
public static String multiply(String a,String b){
String resultString = "";
try {
char[] charA = deleteZeroStrng(a).toCharArray();
char[] charB = deleteZeroStrng(b).toCharArray();
int charALength = charA.length;
int charBLength = charB.length;
//进位
int carry = 0;
//相乘得到的是N个数,然后求和
String[] result = new String[charBLength];
//二次循环
for (int i = 0; i<charBLength; i++) {
int valueB = charB[i]-'0';
StringBuilder tempStr = new StringBuilder("");
for (int j = 0; j<charALength; j++) {
int valueA = charA[j]-'0';
int temp = valueB*valueA+carry;
tempStr.append(temp%10);
carry = temp/10;
}
if(carry!=0){
tempStr.append(carry);
}
result[i]=tempStr.reverse().toString();
for(int k=0;k<i;k++){
result[i]+="0";
}
carry = 0;
}
resultString = result[0];
for (int i=1;i<result.length;i++) {
resultString=add(resultString, result[i]);
}
} catch (Exception e) {
System.out.println("至少有一个字符串不属于数字!");
}
return resultString;
}
/**
* 利用乘法
* 模拟阶乘
*/
public static String factorial(Long n){
String str = "1";
for (int i = 2; i <= n; i++) {
str = multiply(str.toString(),String.valueOf(i));
}
return str;
}
/**
* 清除以0,00等开头的字符串,逆序排列
*/
public static String deleteZeroStrng(String s) throws Exception{
if(s.matches("[0]+")){
return "0";
}
else if(s.matches("\\d+")){
StringBuilder builder = new StringBuilder("");
if(s.matches("^[0]+")){
builder.append(s.split("^[0]+")[1].trim());
}else{
builder.append(s.trim());
}
return builder.reverse().toString();
}else{
throw new Exception();
}
}
public static void main(String[] args) {
try {
String a = "1345435435234792334534534543543";
String b = "1803454350435345543543543454354";
BigInteger bigA = new BigInteger(a);
BigInteger bigB = new BigInteger(b);
System.out.println(a+" + "+b+" = "+add(a, b));
System.out.println(a+" X "+b+" = "+multiply(a, b));
System.out.println("java自带的类:"+bigA.add(bigB));
System.out.println("java自带的类:"+bigA.multiply(bigB));
long n = 94;
System.out.println("!"+n+" = "+factorial(n));
BigInteger result = new BigInteger("1");
for (int i = 2; i <= n; i++) {
BigInteger add = new BigInteger(String.valueOf(i));
result = result.multiply(add);
}
System.out.println("!"+n+" = "+result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
有限元钢架结构分析手算+matlab+ansys模拟
机器学习-系统聚类手算
有限元钢架结构分析~手算matlabansys模拟.doc
手算与PKPM内力对比及电算正确性研究,李玥,刘小蔚,结合实际工程,简要介绍了某钢筋混凝土框架结构住宅楼手算竖向恒载和水平地震荷载内力的计算方法及计算过程。水平地震荷载计算采
有限元钢架结构分析~手算+matlab+ansys模拟.docx
有限元钢架结构分析~手算+matlab+ansys模拟.doc
有限元钢架结构分析-手算+matlab+ansys模拟.doc
有限元钢架结构分析-手算+matlab+ansys模拟.docx
手算钢筋公式大全.doc
手算钢筋公式合集详细图解,手算钢筋公式合集详细图解课件,手算钢筋公式合集详细图解PPT
有限元钢架结构分析-手算+matlab+ansys模拟整理.pdf
梁钢筋计算方法用于手算本人自己整理完毕的。用于初学着
建筑工程工程量图解超详细手算,建筑工程工程量图解超详细手算课件,建筑工程工程量图解超详细手算PPT
框架结构PKPM手算与电算分析.pdf
土钉墙支护计算手算.doc
工程预算手算秘籍 工程预算手算秘籍 工程预算手算秘籍 工程预算手算秘籍 工程预算手算秘籍
框架结构一榀框架手算计算书.doc