在 C++ 或通用示例中截断整数

toh*_*haz 1 c c++ algorithm

有没有一种优雅的方法来截断左方向十进制或基数无关的整数?

例如我有:

unsigned int val1 = 17301;
Run Code Online (Sandbox Code Playgroud)

该算法必须通过一次调用从左侧截断 1 个(十进制)数字,因此对于 val1,4 次调用的结果将是:

truncate_left(17301) returns 7301
truncate_left(7301) returns 301
truncate_left(301) returns 1
truncate_left(1) returns 0
Run Code Online (Sandbox Code Playgroud)

返回值也是整数。c/c++ 解决方案最适合我。任何外部(和/或)数学库都不受欢迎,我对通用方法感兴趣

@ATylor 我丑陋的解决方案是:

unsigned int truncate_left(unsigned int val) {
  unsigned int divider = 1000000000, dec;
  for(unsigned int pow10 = 10; pow10 > 0; pow10--) {
    if(val % divider != val) {
      dec = val / divider;
      printf("dec = %d\n", divider);
      break;
    }
    divider /= 10;
  }
  return val - dec * divider;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

mah*_*mah 5

我不知道为什么@MM 删除了他几乎就在那里的答案,但这是更正后的版本:

int truncate_left(int x)
{
    int c = (int)log10(x);
    while (x > pow(10,c)) x -= pow(10,c);
    return x;
}
Run Code Online (Sandbox Code Playgroud)

如果 math.h 和 -lm 的使用有问题,请将 log10 和 pow 替换为以下内容:

int mylog10(int val)
{
   if (val > 9) return 1 + mylog10(val/10);
   return 1;
}

int mypow(int val, int pwr)
{
    if (pwr > 0) return val * mypow(val, pwr-1);
    return val;
}
Run Code Online (Sandbox Code Playgroud)