在J2ME中,有时会用到开方运算,但是MIDP1.0中没有提供该功能。这里使用笔算开方的方式,实现了开任意数的n次方。这里使用了long作为运算的临时变量类型,在数值较大或者保留位数太多的时候,会出现因为long数值溢出而导致的错误。
public class MainText {
/**
* 开n次方
*
* @param root
* 被开方数
* @param n
* 开方,开n次方
* @param baoliu
* 小数部分保留的位数
* @return
*/
public static String extract(String root, int n, int baoliu) {
String[] zhengShu = null;
String[] xiaoShu = null;
int pointIndex = root.indexOf('.');
if (pointIndex == -1) {
zhengShu = getZhengShu(root, n);
xiaoShu = getXiaoshu("0", n, baoliu);
} else {
zhengShu = getZhengShu(root.substring(0, pointIndex), n);
xiaoShu = getXiaoshu(root.substring(pointIndex + 1), n, baoliu);
}
String result = "";
long a = 0;// 初值
long c = 0;// 差
long b = 0;// 尝试的商值
int index = 0;
while (index < zhengShu.length) {
c = c * power(10, n) + Long.parseLong(zhengShu[index]);
b = 1;
while (power(10 * a + b, n) - power(10 * a, n) <= c) {
b++;
if (b == 10) {
break;
}
}
b = b - 1;
c = c - (power(10 * a + b, n) - power(10 * a, n));
a = a * 10 + b;
index++;
}
result += a + ".";// 整数部分计算完毕
index = 0;
while (index < xiaoShu.length) {
c = c * power(10, n) + Long.parseLong(xiaoShu[index]);
b = 1;
while (power(10 * a + b, n) - power(10 * a, n) <= c) {
b++;
if (b == 10) {
break;
}
}
b = b - 1;
c = c - (power(10 * a + b, n) - power(10 * a, n));
a = a * 10 + b;
index++;
}
result += (a + 5) % power(10, baoliu + 1);// 这里 a + 5 是为了实现四舍五入
result = result.substring(0, result.length() - 1);// 放弃最后1位
return result;
}
/**
* 根据开方n的数值,将整数部分划分成若干片段
*
* @param str
* @param n
* @return
*/
private static String[] getZhengShu(String str, int n) {
int length = str.length() / n;
if (str.length() % n != 0) {
length += 1;
}
String[] zhengShu = new String[length];
for (int i = zhengShu.length - 1; i > 0; i--) {
zhengShu[i] = str.substring(str.length() - n);
str = str.substring(0, str.length() - n);
}
zhengShu[0] = str;
return zhengShu;
}
/**
* 根据开方n的数值和保留的位数,将小数部分划分成若干片段
*
* @param str
* @param n
* @param decimalDigits
* @return
*/
private static String[] getXiaoshu(String str, int n, int decimalDigits) {
int length = decimalDigits + 1;
while (str.length() < length * n) {
str += "0";
}
String[] xiaoShu = new String[length];
for (int i = 0; i < xiaoShu.length; i++) {
xiaoShu[i] = str.substring(0, n);
str = str.substring(n);
}
return xiaoShu;
}
/**
* 得到一个数的n次方
*
* @param shu
* @param n
* @return
*/
private static long power(long shu, int n) {
long result = 1;
while (n > 0) {
result *= shu;
n--;
}
return result;
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("将3开2次方,保留3位小数:" + extract("3", 2, 3));
System.out.println("将3开5次方,保留3位小数:" + extract("3", 5, 3));
System.out.println("将3.08开2次方,保留3位小数:" + extract("3.08", 2, 3));
}
}
引用:http://blog.csdn.net/cuilichen/archive/2008/09/03/2872603.aspx
分享到:
相关推荐
MIDP1.0实现开n次方运算。 使用笔算开n次方的方式,实现了开n次方运算。 输入和输出参数都是字符串形式。 这样在MIDP1.0下也可以计算小数。
复杂的BigDecimal计算,需要开方的式子,可输入结果精确位数
采用牛顿迭代发的开n次方的计算方法,可以自己设置精度(如0.00001)结果显示迭代次数等
通过汇编语言实现2的n次方,作业,调试结果正确
自己做的C++小程序,仅供参考,2的N次方2的N次方2的N次方2的N次方2的N次方
java 求n的n次方 java 求n的n次方
分别用分治法、蛮力法、减治法实现了a的n次方,并进行了三种算法的时间性能比较,测试数据可以用1的n次方
易语言计算N次方源码,计算N次方,求开N次方,求N次方
1170:计算2的N次方 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 10500 通过数: 5410 【题目描述】 任意给定一个正整数N(N≤100),计算2的n次方的值。 【输入】 输入一个正整数N。 【输出】 输出2的N次方的值...
计算2的n次方
实现一个数的N次方源码
2的N次方的计算方法。希望对需要的你有帮助哦~
c语言中x的n次方怎么写编程求x的n次方-用C语言程序设计:求x的n次方的函数编程求x的n次方-用C语言程序设计:求x的n次方的函数编程求x的n次方-用C语言程序设计:求x的n次方的函数编程求x的n次方-用C语言程序设计:求x...
编程精确计算2的N次方。(N是介于100和1000之间的整数)。
这个资源所包含的程序是用C++编程来完成求a的n次方的算法
易语言源码易语言计算N次方源码.rar 易语言源码易语言计算N次方源码.rar 易语言源码易语言计算N次方源码.rar 易语言源码易语言计算N次方源码.rar 易语言源码易语言计算N次方源码.rar 易语言源码易语言计算N次方...
分别用蛮力法、分治法、减治法求a的n次方,并比较运行时间
2的n次方 单链表操作 求2的任何一个整数的n次方,
类的编写和使用三个案例 :1 判断三角形并求面积 2 求N次方幂的类 3 人民币转换大写
一个用于计算x的n次方的算法,效率比较高