【发布时间】:2019-01-02 10:06:58
【问题描述】:
假设我有两个数字(最小值和最大值)。 `
例如(0 和 9999999999)
最大值可能如此巨大。现在我也有一些其他的号码。它可能介于最小和最大数量之间。 Let's say 15。现在我需要做的是得到15(15,30,45 and so on, until it reaches the maximum number) 的所有倍数。对于每个这些数字,我必须计算它们的二进制表示中有多少个 1 位。 for example, 15 has 4(because it has only 4 1bits).
问题是,我需要一个循环中的循环来获得结果。第一个循环是获取该特定数字的所有倍数(在我们的示例中为 15),然后对于每个倍数,我需要另一个循环来仅计算 1 位。我的解决方案需要很多时间。这是我的做法。
unsigned long long int min = 0;
unsigned long long int max = 99999999;
unsigned long long int other_num = 15;
unsigned long long int count = 0;
unsigned long long int other_num_helper = other_num;
while(true){
if(other_num_helper > max) break;
for(int i=0;i<sizeof(int)*4;i++){
int buff = other_num_helper & 1<<i;
if(buff != 0) count++; //if bit is not 0 and is anything else, then it's 1bits.
}
other_num_helper+=other_num;
}
cout<<count<<endl;
【问题讨论】:
-
如果您正在寻求帮助和改进代码的提示,我建议您访问 (codereview.stackexchange.com)[codereview.stackexchange.com]。否则你能把你的问题说得更清楚吗?
-
cs-fundamentals.com/tech-interview/c/… 寻找分而治之的策略算法。它计算无符号整数的位。对于 unsigned long long,我需要同样的东西。
-
您可以随时根据您的需要调整给定的解决方案。在这种情况下,您需要更改常量:例如,如果您的
long long是 64 位,0x55555555将变为0x5555555555555555。