c - 如何让这个程序更有效率?
问题描述
我怎样才能找到有多少 Z 数 (Z < N) 具有属性 (N xor Z)> N 其中 N 是 32 位数字并且程序的复杂性是 O(log N);
这是简单的方法,但我真的不知道如何在 O(log N);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int z;
int contor = 0;
FILE* in;
FILE *out;
in= fopen("in.txt", "rt");
if (in == NULL)
{
printf("ERROR!");
return -1;
}
else
{
fscanf(in, "%d", &n);
for (z = 0; z < n; z++)
{
if ((n ^ z) > n)
{
contor++;
}
}
}
out = fopen("out.txt", "wt");
if (out == NULL)
{
printf("Error!");
return 0;
}
else
{
fprintf(out, "%d", contor);
}
fclose(out);
fclose(in);
return 0;
}
解决方案
我会给你一个强有力的提示——不是一个完整的解决方案,但它应该让你沿着正确的轨道思考。
关键是用二进制来思考。二进制中的任何数字都将是 1,后跟 0 和 1 位的某种组合。例如:
100 = 1100100
55 = 110111
17 = 10001
XOR 可以被认为是位翻转。N xor Z
取所有 1 位Z
并翻转N
.
如果你有一个N
像上面这样的数字,你可以翻转哪些位并最终得到一个更大的数字?好吧,如果您将 1 翻转为 0,它会变小。如果你将 0 翻转为 1,它会变得更大。
拿100
。将 0 翻转为 1,它会变得更大:
100 = 1100100
108 = 1101100
将 1 翻转为 0 并缩小:
100 = 1100100
68 = 1000100
该问题的解决方案将涉及计算N
. (答案不仅仅是0 位的计数,而且它肯定会以某种方式使用该计数。)直觉上,这似乎是在正确的轨道上——你正在寻找一个对数解决方案,并且数字有一个对数位。
推荐阅读
- c# - 为什么要创建函数 CreateWebHostBuilder()?
- materialized-views - 雪花无效的物化视图定义
- python - 有没有更优雅的方式来表达 ((x == a and y == b) 或 (x == b and y == a))?
- python - 在数据集上应用事务编码器
- jupyter-notebook - 使用 nbsphinx 运行 sphinx
- python - 如何在 pandas .groupby 之后访问列
- c# - 如何使用 Database First 使用 EF 6 调用 Oracle 函数?
- excel - 复制动态范围
- c++ - 如何在不重复的情况下随机迭代向量的每个元素
- r - 在 gganimate 中使用 transition_reveal 来累积绘制线条