这是我在mooc上浙大的java入门课上看到的一个题目,觉得挺适合练手,把我的答案挂出来,希望有些地方能给其他小伙伴以启发,也有很多不足的地方,希望有大神多多指正。题目如下:
数字特征值(5分)
题目内容:
对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。
按照二进制位值将1的位的位值加起来就得到了结果13。
你的程序要读入一个非负整数,整数的范围是[0,100000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。
提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。
输入格式:
一个非负整数,整数的范围是[0,1000000]。
输出格式:
一个整数,表示计算结果。
输入样例:
342315
输出样例:
13
import java.math.BigInteger;
import java.util.Scanner;
/*
本演示代码是为了求数字的奇偶特征值,输入一串数字,输出一串二进制数字表示的特征值。
本代码实现的功能有:
1.使用了StringBuilder类及append()方法。
2.定义了print()递归函数。
3.使用了翻转字符串的方法reverse(),实现了"abc"–>“cba”。
4.使用了Integer包装类型及ParseInt()方法,实现了将字符串类型的二进制数字,如"001101",转换成int类型的十进制数。
*/
public class Demo003
{
static boolean bl = true;
static int i = 0;
static StringBuilder sb = new StringBuilder(1024); // 1
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
int input = in.nextInt();
while (bl)
{
print(input);
}
}
static void print(int N)
{
i += 1;
int x = N % 10;
if ((i % 2) == (x % 2))
{
sb.append(1); // 1
}
else
{
sb.append(0);
}
if (N > 9)
{
System.out.println(x);
print(N / 10); // 2
}
else
{
System.out.println(N);
String s = sb.reverse().toString(); //***
System.out.println(s);
System.out.println(change(s));
bl = false;
}
}
static int change(String st)
{
return Integer.parseInt(st, 2);
}
}
不过作者有一事不明,在我标***号的那一行代码,如果我不定义String s,而是把后面的代码改写为System.out.println(sb.reverse().toString()); System.out.println(change(sb.reverse().toString()));最后字符串String st将不能被正确地转换为十进制数字。比如我输入原题的342315,得到字符串001101,最后转换得到的数字居然是44…作为一个初学编程的小白真的赶脚编程是一门玄学ヾ(>Д<;))))… 逃~~