3.2 数字特征值
题目内容:
对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。
这里的计算可以用下面的表格来表示:
按照二进制位值将1的位的位值加起来就得到了结果13。
你的程序要读入一个非负整数,整数的范围是[0,100000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。
提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。
输入格式:
一个非负整数,整数的范围是[0,1000000]。
输出格式:
一个整数,表示计算结果。
输入样例:
342315
输出样例:
13
import java.util.Scanner;
public class Digit {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int number;
number = in.nextInt(); //输入的数值
int digit = 0;
int count = 0; //表示数位
int result = 0; //表示结果
int a, b=1;
if (number >= 0 && number <= 1000000 )// 判断number的范围
{
do {
digit = number % 10; //取余,即依次从最后一位取出数值
number = number / 10; //依次去掉最后一位
count = count + 1; //数位+1
if (digit%2 == count%2) //判断数字与数位的奇偶性是否相等
{
a=1; //奇偶性相同则记为1
}else
{
a=0; //奇偶性不同则记为0
}
result = result+a*b; //将本次结果累加
b = b *2; //数位每次加1,而二进制值每次乘2
}while(number > 0); //判断是否还有数字进行下一轮循环
}
System.out.println(result);
}
}
除此之外,还可以使用Java Math.pow() 的方法:java.lang.Math.pow() 方法用于返回第一个参数的第二个参数次方。pow() 方法的返回类型为double。
- 语法:
public static double pow(double a, double b)
- 参数:
a:基数; b:指数。 - 返回值:
此方法返回的值a^b。
①如果第二个参数为正零或负零,则此方法将返回1.0。
②如果第二个参数不是数字(NaN),则此方法将返回NaN。
③如果第二个参数为1,则此方法将返回与第一个参数相同的结果。
使用**Math.pow()**函数进行处理,则代码如下:(这里需要注意由于应用了指数函数,所以这里的辅助变量 b的初始值应为0,而上面的方法里辅助变量 b初始值是1)
import java.util.Scanner;
public class Digit {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int number;
number = in.nextInt(); //输入的数值
int digit = 0;
int count = 0; //表示数位
int result = 0; //表示结果
int a, b=0;
if (number >= 0 && number <= 1000000 )// 判断number的范围
{
do {
digit = number % 10; //取余,即依次从最后一位取出数值
number = number / 10; //依次去掉最后一位
count = count + 1; //数位+1
if (digit%2 == count%2) //判断数字与数位的奇偶性是否相等
{
a=1; //奇偶性相同则记为1
}else
{
a=0; //奇偶性不同则记为0
}
result = result+a*(int)(Math.pow(2, b)); //将本次结果累加
b = b + 1 ; //数位每次加1,而二进制值每次乘2
}while(number > 0); //判断是否还有数字进行下一轮循环
}
System.out.println(result);
}
}