发布网友 发布时间:2022-04-23 22:48
共3个回答
热心网友 时间:2023-09-09 15:03
import java.util.Vector;
/**
* P进制数
*
* @author Jarod Yv
*/
public final class P_NUM {
/** 数制 */
public int base = 0;
/** 数字。以Integer的形式保存在向量中 */
public Vector<Integer> num = null;
/** 数字间的分割符 */
private static final String SEP = ":";
public P_NUM(int base, String num) throws Exception {
init(base, num);
}
public P_NUM(int base, int num) throws Exception {
init(base, num);
}
/**
* 初始化一个P进制数
*
* @param base
* 数制 必须为>2的整数
* @param num
* 数字 这里规定每一位之间用:号分割
* @throws Exception
*/
public void init(int base, String num) throws Exception {
// 设置数制
setBase(base);
// 设置数字,讲数字拆成Interger放入一个Vector中
if (num != null) {
this.num = new Vector<Integer>(10);
int beginIndex = 0;
int endIndex = -1;
Integer integer = null;
while ((endIndex = num.indexOf(SEP, beginIndex)) != -1) {
integer = Integer.valueOf(num.substring(beginIndex, endIndex));
if (integer == null || integer.intValue() >= this.base
|| integer.intValue() < 0) {
this.num = null;
throw new Exception("数据存在错误,请检查。");
}
this.num.addElement(integer);
beginIndex = endIndex + 1;
integer = null;
}
integer = Integer.valueOf(num.substring(beginIndex));
this.num.addElement(integer);
integer = null;
} else {
throw new Exception("数字为空");
}
}
/**
* 根据十进制数,初始化一个P进制数
*
* @param base
* 数制
* @param num
* 10进制数
* @throws Exception
*/
public void init(int base, int num) throws Exception {
setBase(base);
this.num = new Vector<Integer>(10);
Integer integer = null;
do {
integer = Integer.valueOf(num % this.base);
this.num.insertElementAt(integer, 0);
integer = null;
num /= this.base;
} while (num > 0);
}
/**
* 将P进制数转换成10进制。 算法为Decimal
* =Square(Pn,n)+...+Square(P2,2)+Square(P1,1)+Square(P0,0)
*
* @return
* @throws Exception
*/
public int toDecimal() throws Exception {
if (this.base < 2 || this.num == null || this.num.size() < 0)
throw new Exception("没有数据");
int result = 0;
Integer interger = null;
int step = this.num.size() - 1;// 最高次幂
for (int i = 0; i < this.num.size(); i++) {
interger = this.num.elementAt(i);
if (interger != null) {
result += interger.intValue() * square(this.base, step);
step--;
}
interger = null;
}
return result;
}
/**
* 设置数制
*
* @param base
* 数制
* @throws Exception
*/
public void setBase(int base) throws Exception {
if (base <= 1)
throw new Exception("数制存在错误,必须大于1");
this.base = base;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("数制 = ");
sb.append(this.base);
sb.append('\n');
sb.append("数字 = ");
for (int i = 0; i < this.num.size(); i++) {
sb.append(((Integer) this.num.elementAt(i)).intValue());
sb.append(':');
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
/**
* 计算平方,此处采用递归算法
*
* @param base
* 底数
* @param n
* 指数
* @return 平方结果
*/
private int square(int base, int n) {
int result = base;
if (n == 0) {
return 1;
} else {
result *= square(base, n - 1);
}
return result;
}
}
public class Test {
public static void main(String[] args) {
try {
P_NUM p1 = new P_NUM(6, "1:2:3:4:5");
P_NUM p2 = new P_NUM(6, "5:4:3:2:1");
System.out.println("p1.toDecimal() = " + p1.toDecimal());
System.out.println("p2.toDecimal() = " + p2.toDecimal());
int result = p1.toDecimal() * p2.toDecimal();
System.out.println("(十进制)p1 * p2 = " + result);
P_NUM p3 = new P_NUM(6, result);
System.out.println("(P进制)p1 * p2 = " + p3.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
原理很简单。将P进制数转换成10进制数进行计算,再将结果转换成P进制数。代码中有注释,其中toDecimal()方法将P进制数转换成10进制数,init(int base, int num)将10进制数转成P进制数。
热心网友 时间:2023-09-09 15:04
/**
* @author Otacon
*/
public class BaseP{
public static void main(String[] args){
int[] a1 = new int[]{15,5,7}; //以p进制所表示的数。现在的数代表16进制的0xF57
int[] a2 = new int[]{2,13,1};
int base = 16; // 进制。现在是16进制。
int[] result = new int[a1.length*2];
for(int i = 0; i < result.length; i++){
result[i] = 0;
}
for(int j = a1.length-1; j >= 0 ; j--){
for(int i = a2.length-1; i >= 0 ; i--){
result[i+j+1] += a1[j]*a2[i]; //做乘法,先不考虑进位
}
}
for(int i = result.length-1; i > 0; i--){ //处理进位
while(result[i] >= base){
result[i] -= base;
result[i-1]++;
}
}
boolean showZero = false;
for(int i = 0; i < result.length; i++){ //打印得出的p进制数。每个数位用[]框住。
if(result[i] ==0 && !showZero)
continue;
showZero = true;
System.out.print("["+result[i]+"]");
}
System.out.println();
}
}
热心网友 时间:2023-09-09 15:04
public class RadixMultiplication {
/**
* 用Java本身的API来实现,思路很简单
*
* 将传进来的数转成10进制,然后相乘,最后将结果再转相应的进制
*
* 这里不考虑最大值的问题
*
* @param radix
* @param numString1
* @param numString2
* @return
*/
public static String result(int radix, String numString1, String numString2) {
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
throw new RuntimeException("基数必须大于等于2且小于等于36");
}
long result = 0;
long num1 = Long.parseLong(numString1, radix);
long num2 = Long.parseLong(numString2, radix);
result = num1 * num2;
return Long.toString(result, radix);
}
public static void main(String[] args) {
String numString1 = "1010100101010010110";
String numString2 = "101010010101101010110010110";
System.out.println(result(2, numString1, numString2));
}
}