C++程序 旋转数字的位数
数字旋转是一种将数字的位数进行改变的操作。例如,我们可以将数字12345旋转,得到34512、45123等。在许多算法问题中,数字旋转是一个常见的操作。如何编写C++代码来实现数字旋转呢?
解法一:暴力枚举
这种解法非常简单,但是时间复杂度较高,不适用于大规模数据的操作。首先我们定义一个函数,用于将数字旋转一个位置:
int rotate_one(int num) {
int x = num % 10;
num /= 10;
int n = 0;
while (num > 0) {
n *= 10;
n += num % 10;
num /= 10;
}
n *= 10;
n += x;
return n;
}
然后我们就可以对这个函数调用n次,进行数字旋转操作,得到旋转n位后的数字。
int rotate_num(int num, int n) {
for (int i = 0; i < n; i++) {
num = rotate_one(num);
}
return num;
}
这时候,我们就可以在主函数里面调用这个函数,并且打印出旋转后的数字了。
int main() {
int num = 12345;
int n = 2;
int result = rotate_num(num, n);
cout << result << endl;
return 0;
}
这段代码的输出结果为:
34512
解法二:数学方法
这种方法使用数学公式,可以在O(1)时间内得到旋转后的数字,属于比较高效的算法。
我们先来看一下,如何将一个数字的后k位移到前面。例如,数字12345,如果我们想要将后两位“45”移到前面,得到“45123”,可以通过以下方法实现:
12345 / 100 = 123
123 * 100 = 12300
45 * 100 = 4500
45123 = 12300 + 4500
同理,如果我们想要将前面k位移到后面,可以通过以下公式实现:
12345 % 10000 = 2345
12345 / 10000 = 1
2345 * 10 + 1 = 23451
有了这些公式,我们就可以很容易地实现数字旋转的操作。
int rotate_num(int num, int n) {
int high = 1, ones = 1;
for (int i = num / 10; i > 0; i /= 10) {
ones *= 10;
}
for (int i = n; i > 0; i--) {
high *= 10;
}
int low = num % high;
int high_num = num / high;
int low_num = low * ones + high_num;
return low_num;
}
这时候,我们也可以在主函数里面调用这个函数,并且打印出旋转后的数字了。
int main() {
int num = 12345;
int n = 2;
int result = rotate_num(num, n);
cout << result << endl;
return 0;
}
输出结果为:
34512
结论
通过以上的两种解法,我们可以发现数学方法更快更简单,而且适用范围更广。当然,暴力枚举方法也是一种可行的方法,只是需要注意其时间复杂度。不管哪种方法,都可以在C++中轻松实现。