C ++:将整数的数字分成相等的部分

时间:2016-04-11 14:38:18

标签: c++ algorithm integer

所以我手边有一个问题,想知道最有效的方法。

我想将一个整数分解成一部分,所以说我有1234我想把它分成1234或者如果我有123我希望它是123

我最初的想法是在一些现代编程语言中转换为字符串,然后获取字符串的长度,然后获取子字符串,但我觉得这不是用C ++编写它的好方法。

请问关于如何解决这个问题的建议,我已经有一个函数可以帮助我从整数中获取数字。

template <class T> int getDigits(T number) {
int digits = 0;
while(number ){
    number /= 10;
    digits++;
}
    return digits;
}

5 个答案:

答案 0 :(得分:2)

获取总位数:

int n = 1;
if (the_integer != 0)
    n = floor(log10(abs(the_integer))) + 1; 

正确的数字始终为 n-n / 2 数字,所需数字可按如下方式计算:

int rDigits = n-n/2;
int factor = pow(10, rDigits);
int left = the_integer / factor;
int right = the_integer % factor;

在c ++中使用pow时,请注意类型转换

总复杂程度:O(1)
实际上,log-function具有O(n)复杂度,但它的ALOT更快

答案 1 :(得分:2)

您几乎拥有所有必需的代码。请注意,函数中的digits变量表示数字字符串表示中右边部分的十个当前幂。当这不仅仅是左边部分时停止。

void split_int(unsigned long long a, unsigned long long& part1, unsigned long long& part2)
{
  part1 = a;
  part2 = 0;
  unsigned long long power = 1;

  while(part1 >= power) {
    unsigned long long r = part1%10;

    part1 /= 10;
    part2 += r*power;

    power *= 10;   
  }
}

使用以下测试程序

int main() {
  unsigned long long x;
  unsigned long long p1, p2;

  x = 1234u;
  split_int(x, p1, p2);
  std::cout << "x = " << x << " -> " << p1 << " " << p2 << std::endl;

  x = 123u;
  split_int(x, p1, p2);
  std::cout << "x = " << x << " -> " << p1 << " " << p2 << std::endl;

  x = 9876543210u;
  split_int(x, p1, p2);
  std::cout << "x = " << x << " -> " << p1 << " " << p2 << std::endl;  
}

它将打印:

x = 1234 -> 12 34
x = 123 -> 1 23
x = 9876543210 -> 98765 43210

答案 2 :(得分:1)

以下是该算法的简单实现:

template <typename T>
std::pair<T, T> seperateNum(T num) {
    auto num_digits = getDigits(num);
    auto half_digits = (num_digits % 2 == 0) ? num_digits / 2 : (num_digits / 2) + 1;

    auto mult = static_cast<T>(pow(10, half_digits));

    return {num / mult, num % mult};
}

当然只适用于整数类型。

答案 3 :(得分:1)

answer by Deus Sum使用以下想法:

  1. 计算每个部分中有多少位数
  2. 计算10的相应功率
  3. 将数字除以10的幂;商和余数是你的部分
  4. 可以在同一循环中计算两个数字,而不是分别进行(1)和(2)。要做到这一点,除了每次增加一个计数器,每隔一次将一个临时变量乘以10。

    template <class T> void PrintHalves(T number)
    {
        int digits = 0;
        T pow10 = 1;
        T temp = number;
        while (temp != 0)
        {
            temp /= 10;
            if (digits % 2 == 0)
                pow10 *= 10;
            digits++;
        }
        // pow10 is a power of 10 that is close to sqrt(number)
        T high = number / pow10;
        int high_digits = digits / 2; // number of digits in the high part
        T low = number % pow10;
        int low_digits = digits - high_digits; // number of digits in the low part
        std::cout <<
            std::setw(high_digits) << std::setfill('0') << high << ' ' <<
            std::setw(low_digits) << std::setfill('0') << low << '\n';
    }
    

    在代码中,我使用setwsetfill操纵器来打印正确数量的前导零。

    注意:对于单位数字(包括0),数字的分离是杂乱的 - 高部分是空的,所以它会打印出零。

答案 4 :(得分:0)

int digit=..;//the number of digits in the number,you already have this
int number=...;//you have the number
int half_way=static_cast<int>(::ceil(digit/2.0));//getting the largest number of digits that will be in the parts
int count=0;

int part_numbers[2]={0};//the two parts

while(number>0)
{
    int part=0;
    for(int j=0;j<half_way;j++)
    {
      part+=static_cast<int>(pow(10.0,j) * (number% 10));
      number=number/10;
    }
    part_numbers[count]=part;
    count++;
}

正如评论部分中的anatolyg所指出的那样,您可以使用自定义整数取幂作为给定的here