参考下面的问题, 如何在 C 中连接两个整数
unsigned concatenate(unsigned x, unsigned y) {
unsigned pow = 10;
while(y >= pow)
pow *= 10;
return x * pow + y;
}
如何在不使用数组的情况下获取 x 和 y 的原始值?我需要更少的处理开销。
参考下面的问题, 如何在 C 中连接两个整数
unsigned concatenate(unsigned x, unsigned y) {
unsigned pow = 10;
while(y >= pow)
pow *= 10;
return x * pow + y;
}
如何在不使用数组的情况下获取 x 和 y 的原始值?我需要更少的处理开销。
您将两个参数传递给concatenate().
如果您将两个参数传递给unconcatenate()您,则可以取回您的数字:
void unconcatenate(unsigned *first, unsigned *second, unsigned concatenated, unsigned limit) {
unsigned pow = 10;
while (pow < limit) pow *= 10;
*first = concatenated / pow;
*second = concatenated % pow;
}
unsigned x, y, foo = concatenate(1234, 56);
unconcatenate(&x, &y, foo, 100);
printf("%u unconcatenaded to %u and %u.\n", foo, x, y);
如何在不使用数组的情况下获取 x 和 y 的原始值?
信息丢失。需要重建x,y额外的信息。
示例 1234 可能是由
x y
123 4
12 34
1 234
0 1234
旁白:改进了原始连接问题的答案。
我还没有对此发表评论,但这个原始问题对我来说毫无意义。
至少根据我的经验,目标是将数字与已知的固定位数连接起来。例如,如果我有
int year = 2021;
int month = 10;
int day = 2;
(即下个月的日期),我想“连接”它们,期望的结果当然是 20211002。输出 2021102 是完全错误的——因为没有人知道它应该是 10 月 2 日,还是也许是 1 月 2 日!
在另一个问题上,有一条评论说“当 y == 0 时 100 * x + y 失败”,好像连接 23 和 0 应该产生 230,或者可能是 23,但这对我来说听起来很疯狂。
由于这里的问题是关于取回原始值,答案显然是要知道每个原始数字有多少位。例如,如果您知道您有两个 2 位数字x和y,那么z = 100 * x + y绝对是连接它们的正确方法。然后,这样做后,取回原始值同样简单:
x = z / 100;
y = z % 100;
关键是我们y提前选择了有效设置为 2 位的神奇数字 100,并将其烘焙到代码中。我们没有,正如其他问题的一些答案(以及此处的此问题中的代码片段)所建议的那样,通过连续乘以 10 在运行时动态地和凭经验发现比例因子。(并且不进行那些连续的乘法pow每次计算,我们的处理开销也会更少。)
摘要:在C中连接数字while(y >= pow) pow *= 10;是错误的方法。正确的方法是
z = 100 * x * y;
一旦你这样做了,你就会得到原来的数字
x = z / 100;
y = z % 100;
如果y可能有更多位数,请选择一个大于 100 的适当乘数,然后改用它。请注意,如果您不小心,您的串联数字最终可能int会比普通数字更大。
PS 我说“如果你知道你有两个 2 位数的数字x和y”,但这并不完全正确。如果您使用100 * x + y,则y必须为两位数(或更少),但x可以超过 2 位(在限制范围内)。