数字特征值
对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是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 |
可以利用数组存储各数字位数以及值,利用for循环进行比较,找相互符合条件的值,再利用二进制进行求和
#include<stdio.h>
#include<math.h>
int main()
{
int n;
int a=1, b=10, c, d, e, f=0;
int s[10];
int w[10];
scanf("%d", &n);
d = n;
while (d>=10)
{
d = d / 10;
a++;
}
c = a;
e = n;
for ( c = 1; c <= a; c++)
for (c = 1; c<=a; c++)
{
s[c] = e % b;
e = e / 10;
}
for ( c = 1; c <= a; c++)
{
if (c % 2 != 0 && s[c] % 2 != 0 || c % 2 == 0 && s[c] % 2 == 0)
{
w[c] = 1;
}
else
w[c] = 0;
}
for ( c = 1; c <=a; c++)
{
if (w[c]!=0)
{
f = f + pow(2, (c - 1));
}
}
printf("%d", f);
return 0;
}
运行结果: