问题 G: 手机号加密
题目描述
小睿同学常在网上备份通讯录,他担心通讯录中手机号码和对应人的相关信息一旦泄露就会留下后患,所以,他想将手机号加密后再上传备份。小睿对二进制码很有研究,他给出的加密规则是:先将11位的手机号码后八位转换成二进制数,然后将该二进制数高位补零到27位后左右翻转,再将翻转后的二进制数转换成十进制数处理成八位作为加密后手机号码的后八位(若转换后不到八位则高位补零到八位,若多于八位只取低八位)。例如:他的朋友的手机号码是13021246316,应将后八位21246316转换成二进制数A=1010001000011000101101100,25位的A高位补两个0后再翻转得到二进制数B=001101101000110000100010100,再将B转化为十进制数为28598548,所以加密后的手机号码为13028598548。实际上小睿的加密规则还有后续步骤,但为简化解题,本题给出手机号的后八位,你只需编程按上述加密规则处理成符合要求的新号码的后八位即可,其它步骤不用你去完成。
输入
仅有一行,只包含八个数字,无其它字符。
输出
仅有一行,只包含八个数字,无其它字符。
样例输入
复制样例数据 21246316
样例输出
28598548
这个题写了一次样例过了但是00000001没过,然后就开始漫长的改代码之路,先贴一下之前错误的代码
#include <bits/stdc++.h>
using namespace std;
int sum=0,a,b=1,c[30],d[30]={0},cnt=0;
int main()
{
cin>>a;
while(a!=0)
{
c[cnt++]=a%2;
a=a/2;
}
for(int i=0;i<=cnt;i++)
{
d[i]=c[26-i];
}
for(cnt=0;cnt<27;cnt++)
{
sum=(sum+d[cnt]*b)%100000000;;
b=b*2;
}
cout<<sum<<endl;
return 0;
}
改完后00000001的答案对了但是按下葫芦浮起瓢,00000000只输出了0,就又改了输出样式,设置域宽然后用0补齐就ac了
#include <bits/stdc++.h>
using namespace std;
int sum=0,a,b=1,c[30]={0},d[30]={0},cnt=0;
int main()
{
cin>>a;
while(a!=0)
{
c[cnt++]=a%2;
a=a/2;
}
for(int i=0;i<=26;i++)
{
d[i]=c[26-i];
}
for(cnt=0;cnt<27;cnt++)
{
sum=(sum+d[cnt]*b)%100000000;;
b=b*2;
}
cout<<setw(8)<<setfill('0')<<sum<<endl;
return 0;
}
继续喜欢继续