题目描述
小睿同学常在网上备份通讯录,他担心通讯录中手机号码和对应人的相关信息一旦泄露就会留下后患,所以,他想将手机号加密后再上传备份。小睿对二进制码很有研究,他给出的加密规则是:先将11位的手机号码后八位转换成二进制数,然后将该二进制数高位补零到27位后左右翻转,再将翻转后的二进制数转换成十进制数处理成八位作为加密后手机号码的后八位(若转换后不到八位则高位补零到八位,若多于八位只取低八位)。例如:他的朋友的手机号码是13021246316,应将后八位21246316转换成二进制数A=1010001000011000101101100,25位的A高位补两个0后再翻转得到二进制数B=001101101000110000100010100,再将B转化为十进制数为28598548,所以加密后的手机号码为13028598548。实际上小睿的加密规则还有后续步骤,但为简化解题,本题给出手机号的后八位,你只需编程按上述加密规则处理成符合要求的新号码的后八位即可,其它步骤不用你去完成。
输入
仅有一行,只包含八个数字,无其它字符。
输出
仅有一行,只包含八个数字,无其它字符。
样例输入
21246316
样例输出
28598548
不是很难,有个细节一直没注意
//注意00000000的情况
#include <bits/stdc++.h>
#include <stdio.h>
using namespace std;
int main()
{
int a[30];
int n;
scanf("%d",&n);
memset(a,0,sizeof(a));
int i=1;
while(n){
a[i++]=n%2;
n=n/2;
}
for(i=1;i<=27;i++){
n=(n*2+a[i])%100000000;
}
int m=n,k=0;
// m=3541;
while(m){
m=m/10;k++;
}
// printf("%d\n",k);
for(;k<8;k++){
printf("0");
}
if(n!=0) printf("%d\n",n);//注意0的情况
}