【问题标题】:how to replace the first two digits of an integer in c++? [closed]如何替换C++中整数的前两位? [关闭]
【发布时间】:2020-01-03 18:52:13
【问题描述】:

我面临以下问题。:

我有一个 6 位正整数值,例如 120117,我希望能够将前两位数(在本例中为 12)更新为:

  • 如果该两位数小于或等于 20,则为 50
  • 如果该两位数大于 20,则为 60。

所以上面例子的最终输出是500117

所有输入都是正的 6 位整数。

我知道我可以将此整数转换为字符串,然后使用.substr 在所需位置插入 50 或 60,但我不想使用任何与字符串相关的操作。我只想使用算术运算。

我真的不知道该怎么做。任何帮助将不胜感激。

【问题讨论】:

  • 提示:使用数学。
  • @JesperJuhl 我知道这与一些数学逻辑有关,但我无法弄清楚。非常感谢您的帮助。
  • 我将始终输入长度为 6 位且只有正数的输入。 - ...您为什么不一开始就告诉呢?这使它变得微不足道。
  • @Angelina 他的意思是 1) 找到位数(称为 N),2)找到 10^(N-2)(称为 X),3)将原始数字除以 X . 总而言之,这将为您提供一个以 10 为底的 2 位整数,代表前两位数。但是,是的,J. Doe 是对的,如果您总是有 6 位输入,那么只需除以 10000 即可确定前两位数字是小于 20 还是大于 20。
  • @Angelina -- 什么是120117 / 10000 并删除小数点?看到什么给你提示的东西?

标签: c++ integer


【解决方案1】:

让我成为输入 (120117)。令 D 为 ⌊log10(I)⌋ + 1 给出的位数>。令 T 为 10D - 2。使用整数除法令 P 为 I/T。这个结果是前两位数。将此与 20 进行比较,如果谓词匹配,则根据比较结果让 S 为 60 或 50。设输出为 I + (S - P) * T。

能给个伪代码吗?

I = 120117
D = 6
T = pow(10, D - 2)
P = I / T
S = 50 if P <= 20 else 60
return I + (S - P) * T

这里的逻辑依赖于以下观察:将一个数字乘以基数相当于将数字“左移”,除法相当于右移。由于我们处理的是十进制数字,所以我们用 10 进行乘除。重复乘除相同的数字可以简化为乘以或除以该数字的重复次数的幂。通过基于基数的对数找到位数也遵循相同的移位行为,但这并不那么直观。

不过使用字符串操作会更简单。

【讨论】:

  • 能给个伪代码吗?
  • 这种类型的理论答案技术上回答了这个问题,但过于宽泛。 OP 提供了足够的信息,可以简化此答案以声明您可以将输入除以 10000 并比较整数结果以确定答案。然后可以将输入除以 10000 的整数除法的其余部分添加到答案中以产生最终结果。 @Angelina 因为这个问题现在已经结束,所以如果不编辑这个最终的、剩余的答案,当然是不可能提供伪代码的。
  • @JoelTrauger 尽管您提到的内容,但您可以在 cmets 中提供它。我在第二部分有点迷失了..The remainder of the integer division of the input with 10000 could then be added to the answer to result in the final outcome
  • @Angelina 我加了一个伪代码
  • 例如,现在如果我想做一些不同的事情,比如将 50 添加到现有输入 120117 以输出 50120117,您的逻辑是否仍然有效?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 2013-10-18
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
相关资源
最近更新 更多