UPC acm20级训练赛NO.12Problem G(手机号加密)

问题 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;
}

继续喜欢继续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值