C++程序 旋转数字的位数

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++中轻松实现。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例