数字特征值
题目内容
对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。
这里的计算可以用下面的表格来表示:
数字 3 4 2 3 1 5
数位 6 5 4 3 2 1
数字奇偶 奇 偶 偶 奇 奇 奇
数位奇偶 偶 奇 偶 奇 偶 奇
奇偶一致 0 0 1 1 0 1
二进制位值 32 16 8 4 2 1
按照二进制位值将1的位的位值加起来就得到了结果13。
你的程序要读入一个非负整数,整数的范围是[0,100000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。
提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。
输入格式
一个非负整数,整数的范围是[0,1000000]。
输出格式
一个整数,表示计算结果。
输入样例
342315
输出样例
13
算法设计
1.获得用户输入input
2.x = Input%10获得input每一位上的数字
3.令n初始化为1,来表示当前为第n位
4.令n_k = n % 2来表示n的奇偶性
5.同理x_k = x % 2表示x的奇偶性
6.使用if函数,条件为n_k == x_k,若相等赋值p=1,不相等赋值p=0
7.令bin = bin+p10^(n-1)来得到二进制数值
8.n++每循环一次,n要挪动一位
9.以上内容放到do while循环中,条件是input != 0
此时已经获得输入转化的二进制数,下一步需要将其转化为十进制数
10.令q = bin%10返回二进制数每一位上的数字
11.bin = bin/10每一次循环需要将bin各位的数字划掉
12.dec = dec + q2^(n-1)获得对应的十进制数
13.以上三步放进dowhile循环中,条件是bin!=0
14.输出dec
程序如下
import java.util.Scanner;
public class ex9 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int Input; /*获得用户输入*/
int x; /*第n位的数字*/
int n = 1; /*第n位*/
int n_k; /*n的奇偶性*/
int x_k; /*x的奇偶性*/
int p; /*根据奇偶性是否相等得到的0/1*/
int bin = 0; /*创建的二进制值*/
int q; /*bin的每位数值*/
int dec = 0; /*根据bin换算的十进制数值*/
int j = 1; /*生成十进制数值时的计数值*/
Scanner in = new Scanner(System.in);
Input = in.nextInt();
do
{
x = Input % 10;
Input = Input / 10;
n_k = n % 2;
x_k = x % 2;
if(n_k == x_k)
{
p = 1;
}
else
{
p = 0;
}
bin = (int) (bin + p * Math.pow(10, n - 1));
n++;
}while(Input != 0);
//System.out.println(bin);
do
{
q = bin % 10;
bin = bin / 10;
dec = (int) (dec + Math.pow(2, j - 1) * q);
j++;
}while(bin != 0);
System.out.println(dec);
}
}
注意
1.在解决复杂问题时,要从局部到整体思考,在本题中,首先思考如何得到input
每一位数字以及位数,之后是如何获得并比较他们的奇偶性,根据他们的结果输出bin,再然后是使用何种循环,循环条件如何设置,等等。首先要从容易解决的局部问题中入手。
2.在构思方案时要遵循变量-算法-流程图-程序的思路去解决问题
3.编程时要分区清晰,首先是定义所有需要用到的变量,之后是具体程序,使用缩进区分循环和判断的嵌套
4.在编程时要添加必要注释,确保在第二次编程时可以进入工作,省去阅读代码的时间






网友评论