计算给定范围内幸运因子总和的算法
Algorithm to calculate sum of LUCKY FACTOR in given range
问题声明:-
给定一个数字N,它是用二进制表示法给出的包含最多1000000个比特。你必须计算幸运的总和FACTOR在1到N的范围内(十进制表示法)。
这里,LUCKY FACTOR的意思是,(转换为二进制表示后)如果最右边或最左边1的邻居为0或为零(对于边界位)。
编辑:-
意味着如果最右边的左边邻居是0,意味着它算作幸运因素,simlarly在左侧也
示例,
5 == 101, LUCKY FACTOR = 2.
7 == 111, LUCKY FACTOR = 0.
13 == 1101, LUCKY FACTOR = 1.
16 == 1110, LUCKY FACTOR = 0.
0 == 0, LUCKY FACTOR = 0.
答案必须是二进制形式
我完全被卡住了,给我一个提示
我的代码
#include<stdio.h>
#include<string>
#include<string.h>
#include<vector>
//#include<iostream>
using namespace std;
vector<string> pp(10000001);
string add(string a, string b) {
if(b == "") return a;
string answer = "";
int c = 0;
int szeA = a.size() - 1;
int szeB = b.size() - 1;
while(szeA >= 0 || szeB >= 0) {
answer = (char)( ( ( ( (szeA >= 0) ? (a[szeA] - 48) : 0 ) ^ ( (szeB >= 0) ? (b[szeB] - 48) : 0 ) ) ^ (c) ) + 48 ) + answer;
c = ( ( ( (szeA >= 0) ? (a[szeA] - 48) : 0 ) & ( (szeB >= 0) ? (b[szeB] - 48) : 0 ) ) | ( ( (szeA >= 0) ? (a[szeA] - 48) : 0 ) & (c) ) | ( ( (szeB >= 0) ? (b[szeB] - 48) : 0 ) & (c) ) );
szeA--;
szeB--;
}
if(c) answer = '1' + answer;
return answer;
}
string subtract(string a, string b) {
int sze = a.size() - b.size();
while(sze--) b = '0' + b;
sze = a.size();
for(int i = 0; i < sze; i++) {
if(b[i] == '1') b[i] = '0';
else b[i] = '1';
}
if(b[sze-1] == '0') {
b[sze-1] = '1';
}
else {
int i = sze-1;
while(i >= 0 && b[i] == '1') {
b[i] = '0';
i--;
}
if(i >= 0) b[i] = '1';
else b = '1' + b;
}
b = add(a, b);
b.erase(b.begin() + 0);
//b[0] = '0';
while(b[0] == '0') b.erase(b.begin() + 0);
return b;
}
string power(int index) {
if(index < 0) return "";
string answer = "";
while(index--) {
answer = '0' + answer;
}
answer = '1' + answer;
return answer;
}
string convert(long long int val) {
int divisionStore=0;
int modStore=0;
string mainVector = "";
do {
modStore=val%2;
val=val/2;
mainVector = (char)(modStore+48) + mainVector;
}while(val!=0);
return mainVector;
}
string increment(string s) {
int sze = s.size()-1;
if(s[sze] == '0') {
s[sze] = '1';
return s;
}
while(sze >= 0 && s[sze] == '1') {
s[sze] = '0';
sze--;
}
if(sze >= 0) s[sze] = '1';
else s = '1' + s;
return s;
}
main() {
int T;
char s[1000001];
string answer;
scanf("%d", &T);
for(int t = 1; t <= T; t++) {
int num;
answer = "1";
int bitComeEver = 0;
int lastBit = 0;
scanf("%s", s);
int sze = strlen(s);
// I used below block because to avoid TLE.
if(sze > 3300) {
printf( "Case #%dn", t);
for(int i = 0; i < sze; i++) printf("%c", '1');
printf("n");
//continue;
}
else {
if(pp[sze-1] != "") answer = pp[sze-1];
else {
pp[sze-1] = power(sze-1);
answer = pp[sze-1];
}
answer = subtract(answer, convert(sze-1));
////////////////////////////
//cout << answer << endl;
for(int i = 1; i < sze; i++) {
if(s[i] == '1') {
if(s[1] == '0') {
num = sze-i-1;
if(num > 0) {
if( pp[num-1] == "") {
pp[num-1] = power(num-1);
}
if(pp[num+1] == "") {
pp[num+1] = power(num+1);
}
answer = add(answer, subtract(pp[num+1], pp[num-1]));
if(lastBit) answer = add(answer, "1");
//else answer = increment(answer);
//cout << "tt" << answer << endl;
}
else{
int inc;
if(lastBit) inc = 2; //answer = add(answer, "10");
else inc = 1; //answer = increment(answer);
if(s[i-1] == '0') lastBit = 1;
else lastBit = 0;
if(lastBit) inc += 2;
else inc += 1;
if(inc == 2) answer = add(answer, "10");
else if(inc == 3) answer = add(answer, "11");
else answer = add(answer, "100");
}
}
else {
if(num > 0) {
if(pp[num-1] != "") pp[num-1] = power(num-1);
answer = add(answer, pp[num-1]);
}
else {
int inc = 0;
if(lastBit) inc = 1; //answer = increment(answer);
if(s[i-1] == '0') lastBit = 1;
else lastBit = 0;
if(lastBit) inc += 1;
answer = add(answer, convert(inc));
}
}
if(s[i-1] == '0') lastBit = 1;
else lastBit = 0;
}
}
if(s[sze-1] == '0') {
if(lastBit) {
if(s[1] == '0') {
answer = add(answer, "10");
}
else answer = increment(answer);
}
else if(s[1] == '0'){
answer = increment(answer);
}
}
printf( "Case #%dn", t);
for(int i = 0; i < sze; i++) printf("%c", answer[i]);
printf("n");
}
}
return 0;
}
如果一个数字有k位,则计算幸运因子为2:的数字的数量
10…………..01
因此,在这种情况下,前两位和后两位是固定的,剩余的k-4位可以具有任何值。这样的数字的数目=2^(k-4)
。
所以你可以很容易地计算出这些数字的幸运因子之和=lucky_factor x 2^(k-4)
(当然,这是假设k>=4)
更重要的是,你不需要计算这个数字,因为它的形式是10000000。
如果数字n是11010010。则小于n的8位数字应为以下形式:10…..或1100…..或1101000_。如果你看到一个模式,那么我们已经用数字n 中的1的数量来划分计算
剩下的我留给你。
相关文章:
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 返回arg_min和可选min_val的算法
- 校准和归一化来自多个温度传感器的读数的算法
- 使用opencv在受控环境中进行视频跟踪的跟踪标记和跟踪算法选择
- 回忆和天真算法-2个不同的答案
- 接收数字和数字的算法并检查数字内部数字的次数
- 在二叉搜索树中查找最小和的算法改进
- (C语言)将RGB转换为HSV和HSV的算法在两者的范围为0-255范围内
- 质数搜索算法(两种不同的算法)和Prime表的使用
- C++:用于查找最小周期边和的快速算法
- 有效的算法来检查是否存在具有相同值的行和列
- 关于列表和最大乘积的算法
- 将每个可能的异或和子数组的和相加的算法
- 使用锁和 STL 算法对 C++ 向量进行排序,或者编写一个没有锁的更复杂的算法
- 复杂性和大 - 算法的O
- 在多个相互依赖的线程上进行封送处理和等待的算法、模式或最佳实践
- 对一组数字进行排序的最快数据结构(和排序算法)是什么
- 分析涉及按位运算和 2 的幂的算法
- C++ 和 Python 中的算法相同,但输出不同
- 最大化两个数组元素乘积和的算法