【问题标题】:Split int into single digits. How to handle zeroes将 int 拆分为个位数。如何处理零
【发布时间】:2011-12-27 17:01:30
【问题描述】:

我正在尝试创建一个函数,该函数将采用 int 并分别返回最左边的数字和数字的其余部分。

int idigitizer(int *number) {
int i = 1;
int head = 0;
int tmp = 0;

tmp = *number;
while (tmp > 9) {
    if ((tmp/i) < 10) {
        head = tmp/i;
        *number = *number - (head*i);
        return head;
    } else {
        i = i*10;
    }
}
number = 0;
return tmp;
} 

idigitizer 返回数字的最左边部分,*number 将携带其余部分。 我将在我的 main 中有一个循环,它将继续调用 idigitizer,直到号码的所有数字都分开。 问题是我不知道如何处理零以及如何在完成最后一位数字时使该过程正确终止。欢迎任何帮助。提前致谢。

编辑:使其更清晰。我不希望数字中间可能出现的零丢失。如果我得到数字 100047 作为输入,我希望 idigitizer 返回:

return - *number
         100047
1        00047
0        0047
0        047
0        47
4        7
7

【问题讨论】:

  • 你需要从idigitizer(1000056)返回什么?
  • 您没有告诉我们您在帖子中粘贴的这段代码是什么以及它与您的问题有什么关系。
  • 我希望:1 0 0 0 0 5 6 作为最终产品。当我得到第一个 1 时,我找不到将其余数字保持为 000056 的方法。
  • @MikeNakis 我粘贴的代码返回最左边的数字并将其余数字放入 *number。

标签: c int digits


【解决方案1】:

我会改用这样的东西:

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

int getFirstDigit( int number );
int getRestOfNumber( int number );
int getNumberOfMissingZeros (int number, int restOfNumber);

int main(int argc, char* argv[]){

   int x = 500574;
   int firstDigit;
   int restOfNumber;

   int n; /* loop index */

   firstDigit = getFirstDigit(x);
   restOfNumber = getRestOfNumber(x);

   printf("The first digit of %d is %d.\n",x,firstDigit);
   printf("The rest of the number is ");

   for( n = 0; n<getNumberOfMissingZeros(x,restOfNumber); ++n ){
     printf("0");
   }

   printf("%d.",restOfNumber);

   return EXIT_SUCCESS;
  }

int getFirstDigit( int number ){

  return number / (int)floor( pow(10,floor(log10( (double)number ))) );

}

int getRestOfNumber( int number){

   return number % (int)floor( pow(10,floor(log10( (double)number ))) );

}

int getNumberOfMissingZeros (int number, int restOfNumber){

  int digitsOriginally;
  int digitsInRestOfNumber;

  digitsOriginally = floor(log10( (double)number ) );
  digitsInRestOfNumber = floor(log10( (double)restOfNumber ) );

  return digitsOriginally - digitsInRestOfNumber - 1;

}

神奇之处在于表达式(int)floor( pow(10,floor(log10( (double)number ))) ); 这会获取值的大小,就像52330一样,它会返回10000,因为52330中有五位数字。这样可以很容易地提取最高位。

【讨论】:

  • 为什么我会收到所有这些“未识别的 log10 floor pow trunk 引用”错误?
  • 不知道。您使用的是哪个编译器?另外,自从您编辑它以来,我认为我没有回答您的问题。这不会保留零。
  • 你可能需要链接数学库。将“-lm”放在链接行上。
  • 我使用了 gcc。一切都编译并运行。
  • 我也在使用 gcc。我会尝试 Craig Wright 提出的建议。
【解决方案2】:

鉴于问题的精确措辞约束:a function that will take an int and separately return the leftmost digit and the rest of the number 无法做到,因为无法用整数表示前导零,因此将“其余数字”传回势必会导致永久丢失信息

正如Lost in Space中的机器人所说,“它不会计算。”

【讨论】:

  • 你的意思是实际上不可能从左边开始分隔一个int的数字还是你的意思是我的措辞不好?
  • 嗯,这两者形成了一个闭包,不是吗?从左边开始的 int 的数字是不可能分开的,所以你的措辞一定很差。当然不一定是你的措辞;可能是您的措辞很好,但是您对如何实现最终目标的理解存在缺陷。或者也许这是一个家庭作业,老师错了。我不知道。
  • 你在说什么?您是指 C 中的函数不能有两个返回值这一事实吗?
  • @Eternal_Light 好吧,这不是不可能的,因为我说不可能。等着看有没有人想出点子。但在我看来,它必须是魔法。而且你已经知道原因了:用整数表示“前导零”是不可能的,所以将“余数”传回去势必会造成信息的永久丢失。
  • 好的,我现在明白你在暗示什么了。但你真的应该在你的回答中说这个......
【解决方案3】:

如果我正确理解了这个问题,那么在这样的事情上放置一个适当的循环应该会起作用。

//! Given a number return the least significant digit.
//! Return true if all went well. False otherwise. (Clearly we
//! can handle errors better.)
/*!
   \param[in/out] n
   The number to strip the least significant digit from.
   \param[out] d
   The least significant digit of n.
*/
bool digitize(int& n, int& d)
{
   if ( n == 0 )
      return false
   else
   {
      d = n  % 10;
      n = n / 10;
      return true;
   }    

}

【讨论】:

  • 不,他想要位有效数字。其余的:-)
  • 好的,好的。它是 C++,但使用模数的想法很重要。
猜你喜欢
  • 2013-12-05
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
相关资源
最近更新 更多