如何在 java 中得到特定基数的倒数?
How to get reverse of number with specific base in java?
我是 java 的新手。我只是在写一个函数来接受一个数字及其基数作为参数,然后显示回文数(如果有的话)。主要问题是我不太明白如何反转10以外的基数?我写的代码(根据我糟糕的逻辑)如下:
void CheckPalidrome( int num, int base)
{
long n=num;
boolean palid=false;
long TNum= num;
for(int i=1; i<=10 && palid==false; ++i)
{
int rev=0;
while(n>0 )
{
int d= (int) (n%base);
rev= rev*base + d;
n/=base;
}
if(TNum==rev)
{
palid=true;
}
else{
n=TNum+rev;
TNum=n;
}
System.out.println("TNum= "+TNum+"\trev="+rev);
}
if(palid==true){
System.out.println("Palidrome= "+TNum);
}
else{
System.out.println("None, "+TNum);
}
}
但是,这里面有个问题。它适用于任何数量的 10 基数。但不适用于另一个基数。例如:- 以 10 为底数的 87 将被反转并检查它是否是回文,如果不是,则反转和数字将被添加并再次检查就像:
87+78=165+561=726+627=1353+3531=回文!
但我不知道如何对除 10 以外的其他基地执行此操作。
注意:1211 以 3 为底形成回文 112211 和 3112 以 4 为底形成回文 233332。我使用这些结果来测试我的代码。但是输出不匹配。
请原谅我糟糕的英语。请分享您的知识或给我任何解决问题的想法。我会很高兴和感谢你:)
你的逻辑好像不错,但是记得在给定的base
.
中解析并打印数字
例如数字 1211
(基数 3)与 49
(基数 10)相同。
为了看到这个,我像这样重写了你的代码:
private static int findPalindrome(int num, int base) {
for (int n = num, rev; n > 0; n += rev) {
if ((rev = reverse(n, base)) == n)
return n;
System.out.printf("%-6s + %-6s", Integer.toString(n, base), Integer.toString(rev, base));
if (base != 10)
System.out.printf(" = (%-4d + %-4d) ", n, rev);
System.out.printf("%n = ");
}
return 0;
}
private static int reverse(int num, int base) {
int rev = 0;
for (int n = num; n != 0; n /= base)
rev = rev * base + n % base;
return rev;
}
然后这样测试:
public static void main(String[] args) {
test("87", 10);
test("1211", 3);
test("3112", 4);
}
private static void test(String num, int base) {
System.out.printf("%2d: ", base);
int p = findPalindrome(Integer.parseInt(num, base), base);
System.out.printf("%-15s", Integer.toString(p, base));
if (base != 10)
System.out.printf(" = (%-11d)", p);
System.out.printf("%n%n");
}
产生了这个输出:
10: 87 + 78
= 165 + 561
= 726 + 627
= 1353 + 3531
= 4884
3: 1211 + 1121 = (49 + 43 )
= 10102 + 20101 = (92 + 172 )
= 100210 + 12001 = (264 + 136 )
= 112211 = (400 )
4: 3112 + 2113 = (214 + 151 )
= 11231 + 13211 = (365 + 485 )
= 31102 + 20113 = (850 + 535 )
= 111221 + 122111 = (1385 + 1685)
= 233332 = (3070 )
()
中的数字是以10为底的数字。其他号码显示在 :
.
之前列出的 base
我是 java 的新手。我只是在写一个函数来接受一个数字及其基数作为参数,然后显示回文数(如果有的话)。主要问题是我不太明白如何反转10以外的基数?我写的代码(根据我糟糕的逻辑)如下:
void CheckPalidrome( int num, int base)
{
long n=num;
boolean palid=false;
long TNum= num;
for(int i=1; i<=10 && palid==false; ++i)
{
int rev=0;
while(n>0 )
{
int d= (int) (n%base);
rev= rev*base + d;
n/=base;
}
if(TNum==rev)
{
palid=true;
}
else{
n=TNum+rev;
TNum=n;
}
System.out.println("TNum= "+TNum+"\trev="+rev);
}
if(palid==true){
System.out.println("Palidrome= "+TNum);
}
else{
System.out.println("None, "+TNum);
}
}
但是,这里面有个问题。它适用于任何数量的 10 基数。但不适用于另一个基数。例如:- 以 10 为底数的 87 将被反转并检查它是否是回文,如果不是,则反转和数字将被添加并再次检查就像: 87+78=165+561=726+627=1353+3531=回文!
但我不知道如何对除 10 以外的其他基地执行此操作。 注意:1211 以 3 为底形成回文 112211 和 3112 以 4 为底形成回文 233332。我使用这些结果来测试我的代码。但是输出不匹配。
请原谅我糟糕的英语。请分享您的知识或给我任何解决问题的想法。我会很高兴和感谢你:)
你的逻辑好像不错,但是记得在给定的base
.
例如数字 1211
(基数 3)与 49
(基数 10)相同。
为了看到这个,我像这样重写了你的代码:
private static int findPalindrome(int num, int base) {
for (int n = num, rev; n > 0; n += rev) {
if ((rev = reverse(n, base)) == n)
return n;
System.out.printf("%-6s + %-6s", Integer.toString(n, base), Integer.toString(rev, base));
if (base != 10)
System.out.printf(" = (%-4d + %-4d) ", n, rev);
System.out.printf("%n = ");
}
return 0;
}
private static int reverse(int num, int base) {
int rev = 0;
for (int n = num; n != 0; n /= base)
rev = rev * base + n % base;
return rev;
}
然后这样测试:
public static void main(String[] args) {
test("87", 10);
test("1211", 3);
test("3112", 4);
}
private static void test(String num, int base) {
System.out.printf("%2d: ", base);
int p = findPalindrome(Integer.parseInt(num, base), base);
System.out.printf("%-15s", Integer.toString(p, base));
if (base != 10)
System.out.printf(" = (%-11d)", p);
System.out.printf("%n%n");
}
产生了这个输出:
10: 87 + 78
= 165 + 561
= 726 + 627
= 1353 + 3531
= 4884
3: 1211 + 1121 = (49 + 43 )
= 10102 + 20101 = (92 + 172 )
= 100210 + 12001 = (264 + 136 )
= 112211 = (400 )
4: 3112 + 2113 = (214 + 151 )
= 11231 + 13211 = (365 + 485 )
= 31102 + 20113 = (850 + 535 )
= 111221 + 122111 = (1385 + 1685)
= 233332 = (3070 )
()
中的数字是以10为底的数字。其他号码显示在 :
.
base