0还是1?

发布于 2019-06-07  51 次阅读


0还是1?

题目

  • 给定你一个十进制数,将其转成二进制,然后将二进制数上的'1'都变成'0','0'都变成'1',将转换后的二进制数转为十进制数,将其输出。

输入

  • 输入包含多个测试实例,每个实例包含一个整数a(0<a<2^63),a为非正数时结束输入。

输出

  • 对于每个测试实例,请输出转化后的a,每个实例的输出占一行。

样例输入

  • 2
  • 10
  • 42

样例输出

  • 1
  • 5
  • 21

思路

按照以往的想法 转成二进制 0和1互换 再转十进制
贴一下本来的代码吧

#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
long long tmp[10000];
long long H(long long n)
{
    memset(tmp,0,sizeof(tmp));
    long long cnt = 0;
    while(n)
    {
        tmp[cnt] += n%2;
        if(tmp[cnt])tmp[cnt] = 0; else tmp[cnt] = 1;
        n/=2;
        cnt++;
    }
    long long sum=0,_t = 1;
    for(long long i=(cnt-1);i>=0;i--)
    {
        _t=1;
        if(tmp[i])
        {
            for(long long j=1;j<=i;j++)
            {
                _t*=2;
            }
            sum+=tmp[i] * _t;
        }else continue;
    }
    return sum;
}
int main()
{
    long long n;
    while(~scanf("%lld",&n))
    {
    //  printf("%lld\n",n);
        if(n<=0)break;
        printf("%lld\n",H(n));
    }
    return 0;
}
//0101

如果这样子写 还能优化 打个表 存一下2的平方吧
但是其实这个东西是有规律的

正确做法

来自学长给我的思路 这居然是个思路题
比如 10 的二进制是 1010 替换后 0101 转成 十进制是 5
7 的二进制是 111 替换后 000 转成 十进制是 0
自己多找几个 列出来

总结

所以最后就是... 2的某次方-n-1就能得到值 比如刚刚的10 7就是
2^4 - 10 - 1 = 5
2^3 - 7 - 1 =0
所以先打个表 然后跑for 找到比自己大最近的的那个就ok
最后贴一下代码

#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
    long long a[100];
    long long n;
    for(int i=0;i<=63;i++)
    {
        a[i] = pow(2,i);
    }
    //printf("打表完成");
    while(~scanf("%lld",&n))
    {
        if(n < 1)break;
        for(int i=0;i<=63;i++)
        {
            if(a[i] > n)
            {
                printf("%lld\n",a[i]-n-1);
                break;
            }
        }
    }
    return 0;
}
//10 1010 0101 5 2^4-10-1
//7 111 000 0  2^3-7-1
//15 1111 0000  2^4-15-1
//8 1000 0111 2^4-8-1

还是好热爱web开发