所以我手边有一个问题,想知道最有效的方法。
我想将一个整数分解成一部分,所以说我有1234
我想把它分成12
和34
或者如果我有123
我希望它是1
和23
。
我最初的想法是在一些现代编程语言中转换为字符串,然后获取字符串的长度,然后获取子字符串,但我觉得这不是用C ++编写它的好方法。
请问关于如何解决这个问题的建议,我已经有一个函数可以帮助我从整数中获取数字。
template <class T> int getDigits(T number) {
int digits = 0;
while(number ){
number /= 10;
digits++;
}
return digits;
}
答案 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。
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';
}
在代码中,我使用setw
和setfill
操纵器来打印正确数量的前导零。
注意:对于单位数字(包括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