Ведите ноль в rccp int - PullRequest
       6

Ведите ноль в rccp int

2 голосов
/ 08 марта 2020

У меня есть функция через R cpp, которая инвертирует целое число

#include <Rcpp.h>
using namespace Rcpp;

//' Reverse an integer
//'
//' @param x A single integer.
//' @export
// [[Rcpp::export]]
int reverse_integer(int x) {
  int reverse = 0;
  while(x != 0){
    int remainder = x%10;
    reverse = reverse*10 + remainder;
    x/=10;
  }
  return reverse;
}

Это прекрасно работает для чисел без начальных или конечных нулей

reverse_integer(123) == 321

Однако, когда есть нули, они будут удалены, т.е.

reverse_integer(100) == 1

Как лучше всего изменить эту функцию, чтобы я мог работать с ней как целое число, но не теряя нули?

Ответы [ 2 ]

4 голосов
/ 09 марта 2020

Вам необходимо вернуть строку. 001 не отличается от целого числа 1 в любом языке программирования. Вот как:

#include <Rcpp.h>
using namespace Rcpp;

//' Reverse an integer
//'
//' @param x A single integer.
//' @export
// [[Rcpp::export]]
std::string reverse_integer(int x) {
  int reverse = 0;
  int ndigits = 0;
  while(x != 0){
    int remainder = x%10;
    reverse = reverse*10 + remainder;
    x/=10;
    ndigits++;
  }
  std::string output(ndigits, '\0');
  char * outputp = &output[0];
  std::string fmt_string = "%0" + std::to_string(ndigits) + "d";
  sprintf(outputp, fmt_string.c_str(), reverse);
  return output;
}

Пример:

reverse_integer(103400)
[1] "004301"
3 голосов
/ 08 марта 2020

По умолчанию средство форматирования чисел не будет печатать начальные нули.

Вам нужно будет возвращать строку вместо int, если вы хотите сохранить начальные нули. Вы изменяете свою функцию, чтобы подсчитывать количество конечных нулей во входных данных и добавлять их к возвращаемой строке.

...