云计算百科
云计算领域专业知识百科平台

【在一个区间内,有多少个整数的二进制表示恰好有一个0】2024-7-17

缘由编程问题(c++代码作答)_编程语言-CSDN问答

被蒙蔽了,哪里开的了那么大的数组?用那么费劲的方法去求?10的18次方数据顶多用不到100个元素; 举个简单的荔枝,用样例1-10来说,也就是1+2+4=7,再+8就超过了,从下标1开始也就用到数组4个元素而已; 111开始分别置0则得:110〉101〉10因此算得有3个这样的数,同理类推,也不过是不超过100这样的数而已; 或者换个说法: 10=2。101=5,110=6。 这个题的接法用二进制数组去做,就怕看不懂,所以,后面换个说法了,推算10以内有多少个含1个0的二进制。 上面的分析是把十进制转为二进制,那么,10以内有几个1呢,用1248套一下就知道了,通常我都用1248,按标准的计算机语言叫做8421码,道理是一样的,这就是推导的过程,也就是说没前导0,算的是后面的0,那么,10以内就只有3个二进制数含1个0的,1110=14超过10了,就是这样推导的,自己理解一下。 已经分析了,就该自己动脑去推导,总结规律,编写算法代码,才叫借鉴学习,代码初步构思可能都不用到数组,计数最大数有几位1,计数最小数有几位1,作为区间,依照规律累计就是结果。 10=2。 101=5,110=6。 1110=14,1101=13,1011=11。 11110=30,11101=29,11011=27,10111=23。 111110=(32+16+8+4+2),-1,-2,-4,-8。 可以用其他算法验证以上数据,也就是说以上数据从1到62区间有这几个符合,这已经算是高度分析了,足够总结规律。

void 区间内整数的二进制表示恰好有一个0()
{//缘由https://ask.csdn.net/questions/8130192/54793137
long long w = 0, j = 0, a = 0, b = 0;
int wt = 0, ww = 0, gs = 0;
cin >> a >> b;
da:if (b >= j)
{//同时计算区间1的个数,只怕看了我的代码,多会瞠目结舌,不看我的推导,是无法理解的。
if (w)w *= 2; else w = 1;
j += w;
if (b >= j – 1)++ww;
if (a >= j – 1)++wt;
goto da;
}
js:if (ww >= wt)
{
gs += –ww;
goto js;
}
cout << (gs ? gs : 1) << "\\n";
}

代码由以上推导总结而就,不涉及判断0的位置和数据位移。只怕看了我的代码,多会磕掉牙,不看我的推导,是无法理解的,算法不涉及将十进制转二进制后再判断0的个数。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【在一个区间内,有多少个整数的二进制表示恰好有一个0】2024-7-17
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!