【问题标题】:Get number of digits in an int without divided by 10 [closed]获取不除以10的int中的位数[关闭]
【发布时间】:2018-03-29 08:36:54
【问题描述】:

有没有办法得到不除以10的位数?

例如我有这个:

int main()
{
  int dividend = 100;
  int remainder=0;
  int temp = 0;

  while(dividend>=10)
  {
    dividend = dividend-10;
    temp+=1;
  }
  printf("Quotient: %d\n",temp);
  printf("Reminder: %d\n",dividend);
}

现在我将添加计算变量被除数的位数。

【问题讨论】:

  • dividend-10 如何在这里为任何目的服务?
  • 转换为字符串并计算字符数...注意- 符号。祝你功课好运;-)
  • 顺便说一句:除以 10 有什么问题?这是最有效的方法。
  • @NickA 最好先除以 2 然后再除以 5 以避免舍入问题。不管怎样,这只是重新实现除以 10,这基本上也是所有替代方法最终都会做的事情。
  • 乘以 10 直到你的数字小于 10**n

标签: c++ c


【解决方案1】:

你必须知道整数的最大范围才能使这个函数有用。 没有函数调用,没有除法......

int nbDigitInteger(int number)
{
    if (-10 < number && number < 10) return (1);
    if (-100 < number && number < 100) return (2);
    if (-1000 < number && number < 1000) return (3);
    if (-10000 < number && number < 10000) return (4);
    if (-100000 < number && number < 100000) return (5);
    ...
}

有时候,越简单越好。

【讨论】:

  • 检查运算符是否有负数。并且使用abs() 将节省一些比较。此外,如果您想超快,您可以避免线性搜索并使用减半方法(二分法)来减少 ifs 的运行次数。
  • abs(INT_MIN) 会发生什么?是的,使用二分法会更快,但是如果你不使用abs,你必须写4个条件,我不想使用它,因为abs(INT_MIN)会出错。
【解决方案2】:

如果允许使用对数,那么

int i = 123456;
int digitsCount = ceil(log10(abs(i)+1.0));
cout << digitsCount;

6

【讨论】:

  • 但这不适用于所有整数。它给出了 1、10、100 等的非一的答案,可能是 0 的奇怪答案。你可以使用 int digitsCount = ceil(log10(abs(i) + 1));
  • @IanAbbott 酷!
  • 也许最好用+1.0 替换+1(或用abs 替换fabs)以避免算术溢出。
  • 一个完整的解决方案需要更多。照原样,这将为 i == INT_MAX 提供未定义的行为
【解决方案3】:

你的问题太笼统了,代码也不相关。

由于您尝试发布代码,我将为您提出的问题提供指导。自己写代码。

【讨论】:

  • 那么,这对-3 有用吗? ;-)
  • @Stefan 你知道答案。 :)
  • 不使用函数对我来说很重要!
  • @Abc:嗯,这不会改变算法......此外;这不是一个代码生成网站。
【解决方案4】:

@Yola 非常优雅的解决方案的替代方案是这个。

intPow10 正在返回 10 的幂 exponent。我没有使用来自math.hpow,因为它在数值上很昂贵,而且正如@Tom 指出的那样,它可能导致无效的结果。

#include <stdio.h>
#include<math.h>

int intPow10(int exponent){
    int retval=1;
    while (exponent){
        retval *=10;
        exponent --;
    }
    return retval;
}

int numDigits(const int i) {
    int digits = 1;
    while (intPow10(digits) <= fabs(i)) {
        digits++;
    }
    printf("%i has %i digits.\n", i,digits);
    return digits;
}

int main() {
    numDigits(1);
    numDigits(-1);
    numDigits(10);
    numDigits(13);
    numDigits(-112312);
}

【讨论】:

  • 不使用其他函数非常重要,因为我将用汇编语言重写这个 C 程序,并且我可以使用的命令有限。
  • pow 返回一个双精度值,而 pow(10,2) 可以返回 '"99,9999999" 并提供错误结果。此外,您在每个循环中调用函数“fabs”,这是不必要的。只需执行“ i = fabs(i);”在 while 循环之前。
  • @Abc “因为我会用汇编语言重写这个 C 程序” - 哦,FFS。问你对问题真正感兴趣的是什么,而不是在人们浪费时间回答你不感兴趣的问题之后。当你在汇编中重写它时,会产生巨大的影响关于什么样的代码是可以接受的,什么样的技巧可以避免分裂是合适的。看看编译器将int f(int x) { return x / 10; } 变成了什么:它们并不都发出除法指令。您可以调查他们所做的事情,看看您是否能理解它为什么有效,如果不能,请询问。
  • @hvd 是否可以通过位移除以 10?
【解决方案5】:

这个代码是高尔夫还是什么?

int b = 1000;
char a[10] = itoa(b);
printf("%d\n", strlen(a)); // 4

这只是将 b 变成一个字符串,即 a。然后,打印长度。如果没有 atoi() 和 itoa(),我们该怎么办?我们自己的功能!

【讨论】:

  • 如果 "int b = -10;" 不起作用,对于 64 位整数不起作用。
  • @Tom 的负数 (-10) 是正数(16 位中的 65525)。它应该做。让 OP 试一试,好吗?老实说,我还没有真正测试过它。我刚刚想到了。
  • 我的意思是“-10”是 2 位数字,但 strlen 会返回 3。坦率地说,我知道 C 语言在数学上有一些微妙之处(比如“13.4 / 3 * 3”会不是强制为13.4),而是“负数是正数”?即使整数溢出,“-10”怎么可能是“65525”?还是我误解了你的意思?
  • @Tom's 现在我知道你的意思了,但我认为他并不想使用负数。如果他愿意,他总是可以剥离角色。无论如何,对于 CPU,您不能真正在机器代码中使用 (-)。例如,我们没有 -0x10。相反,我们有最大的正数并倒退。符号位可以帮助我们一点,这是由 CPU 给出的,告诉我们它是正的还是负的。很抱歉,如果它令人困惑。
  • 好吧,如果他不想要负数,那么它应该是“unsigned”,而不是“int”,所以我们必须管理负数。是的,我同意硬件中没有直接的“负”数:我现在明白你的意思了。这就像将“-10”转换为“无符号”:这一切都取决于我们如何解释存储的位。这让我感到困惑,但感谢澄清。第一次没看懂。
猜你喜欢
  • 2012-06-24
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2013-03-11
  • 1970-01-01
相关资源
最近更新 更多