题目解析
题目要求我们实现对一个数字的第一位和最后一位进行交换,其实本质上是对该数字的位数进行了处理,但在处理中又要求我们只交换第一个和最后一个位数,这也就要求我们需要将数字进行拆分并重组。
解题思路
第一步:数值分解
题目中给定了一个正整数,我们首先需要对这个数字进行分解,把各个位数上的数字单独提取出来,此时需要使用到数学知识中的取模运算。
int num = 12345;
int digits[10];
int digit_count = 0;
while (num > 0) {
digits[digit_count++] = num % 10;
num /= 10;
}
这样,我们就将这个数字分解成了5个数字:
1 2 3 4 5
第二步:交换数字
接下来,我们需要将第一个数字和最后一个数字进行交换,这个步骤非常简单,我们只需要使用第三个变量存储一下即可:
int tmp = digits[0];
digits[0] = digits[digit_count - 1];
digits[digit_count - 1] = tmp;
这样,位于第一位的1就和位于最后一位的5交换位置了,数字的排列变成了:
5 2 3 4 1
第三步:数值重组
最后一步,我们需要对这5个数字进行重组,还原成一个完整的数字。要重组这些数字,我们只需要逐个把他们乘以相应的位数的权重,再加和即可:
int new_num = 0;
int base = 1;
for (int i = digit_count - 1; i >= 0; i--) {
new_num += digits[i] * base;
base *= 10;
}
这样,我们就可以得到最后重组后的数字。
完整代码
#include <iostream>
using namespace std;
int main() {
int num = 12345;
int digits[10];
int digit_count = 0;
while (num > 0) {
digits[digit_count++] = num % 10;
num /= 10;
}
int tmp = digits[0];
digits[0] = digits[digit_count - 1];
digits[digit_count - 1] = tmp;
int new_num = 0;
int base = 1;
for (int i = digit_count - 1; i >= 0; i--) {
new_num += digits[i] * base;
base *= 10;
}
cout << new_num << endl;
return 0;
}
运行结果为:52341