Разбить int на однозначные числа.Как справиться с нулями - PullRequest
0 голосов
/ 27 декабря 2011

Я пытаюсь создать функцию, которая будет принимать 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 возвращает крайнюю левую часть номера, а * номер будет содержать остаток. У меня будет основной цикл, который будет продолжать вызывать idigitizer, пока все цифры номера не будут разделены. Дело в том, что я не знаю, как обрабатывать нули и как правильно завершить этот процесс, когда это будет сделано с последней цифрой. Любая помощь приветствуется. Заранее спасибо.

РЕДАКТИРОВАТЬ: чтобы сделать его более понятным. Я не хочу, чтобы возможные нули в середине числа терялись. Если я получу число 100047 в качестве ввода, я хочу, чтобы idigitizer вернул:

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

Ответы [ 3 ]

2 голосов
/ 27 декабря 2011

Я бы использовал что-то вроде этого:

#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 есть пять цифр. Это позволяет легко извлечь самая высокая цифра.

1 голос
/ 27 декабря 2011

Учитывая точно сформулированные ограничения задачи: a function that will take an int and separately return the leftmost digit and the rest of the number это невозможно сделать, потому что невозможно представить ведущие нули в целых числах, поэтому возвращение «остатка числа» неизбежно приведет к необратимой потере информация

Как робот в Затерянный в космосе сказал бы: «Он не вычисляется».

0 голосов
/ 27 декабря 2011

Если я правильно понимаю вопрос, то нужно правильно расположить цикл вокруг чего-то подобного.

//! 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;
   }    

}
...