10019 - Funny Encryption Method

本文介绍了一个加密方法中的步骤,该方法需要将十进制和十六进制的数字转换为二进制,并计算二进制表示中1的数量。通过具体的示例和C语言实现代码,展示了如何完成这一任务。

The Problem

History :
A student from ITESM Campus Monterrey plays with a new encryption method for numbers. These method consist of the following steps:

Steps :  Example
1) Read the number N to encrypt M = 265
2) Interpret N as a decimal number X1= 265 (decimal)
3) Convert the decimal interpretation of N to its binary representation X1= 100001001 (binary)
4) Let b1 be equal to the number of 1’s in this binary representation B1= 3
5) Interpret N as a Hexadecimal number X2 = 265 (hexadecimal)
6) Convert the hexadecimal interpretation of N to its binary representation X2 = 1001100101
7) Let b2 be equal to the number of 1’s in the last binary representation B2 = 5
8) The encryption is the result of  M xor (b1*b2) M xor (3*5) = 262

This student failed Computational Organization, that’s why this student asked the judges of ITESM Campus Monterrey internal ACM programming Contest to ask for the numbers of 1’s bits of this two representations so that he can continue playing.

Task :
You have to write a program that read a Number and give as output the number b1 and b2

The Input

The first line will contain a number N which is the number of cases that you have to process. Each of the following N Lines ( 0<N<=1000) will contain the number M (0<M<=9999, in decimal representation)  which is the number the student wants to encrypt.

The Output

You will have to output N lines, each containing the number b1 and b2 in that order, separated by one space  corresponding to that lines number to crypt

Sample Input

3
265
111
1234

Sample Output

3 5
6 3
5 5

主要问题是十进制和十六进制的数转换成二进制的数,输出二进制数中1的个数

解题思路:直接将十进制数除2取余计算1的个数,而十六进制先转换成十进制再进一步转换计算

 

复制代码
#include<stdio.h>
int main()
{
int b1,b2,x1,x2,n,a[10]={0,1,1,2,1,2,2,3,1,2};
while(scanf("%d",&n)!=EOF){
while(n--){
           scanf("%d",&x1);
           x2=x1;
           for(b1=0;x1;)
           {
           if(x1%2==1) b1++;
           x1=x1/2;
           }
           printf("%d ",b1);
           for(b2=0;x2;)
           {
           b2+=a[x2%10];
           x2/=10;
           }
           printf("%d\n",b2);
}
}
return 0;
}
复制代码

 

转载于:https://www.cnblogs.com/EVA00/archive/2013/01/30/2883609.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值