[英]Reversing last n digits of an Integer in C
我需要编写一个需要 2 位数字(X 和 n)的程序,然后打印 X 并反转 X 的最后 n 位数字。
例如
输入:12345 3
Output:12543
输入:523 2
Output:532
我已经写了一个控制机制来检查 n 是否大于或等于 X 的位数例如,如果输入是 6343 和 7,程序会打印出输入应该被改变并再次接受输入。
我的主要问题是我找不到反转最后 n 位数字的算法。 我可以用这段代码反转任何 int
int X, r = 0;
printf("Enter a number to reverse\n");
scanf("%d", &n);
while (X != 0)
{
r = r * 10;
r = r + n%10;
X = X/10;
}
printf("Reverse of the number = %d", r);
但我不知道两个如何反转最后一个数字。 你能给我任何想法吗?
我不知道如何只反转最后一位数字
使用pow(10,n)
分隔数字 - 请参阅后面的代码。
unsigned reverse_last_digits(unsigned x, unsigned n) {
unsigned pow10 = powu(10, n);
unsigned lower = x%pow10;
unsigned upper = x - lower;
return upper + reverseu(lower, n);
}
创建一个循环,提取最低有效数字 ( %10)
并通过应用该数字构建另一个 integer。 ( y = y*10 + new_digit
)
unsigned reverseu(unsigned x, unsigned n) {
unsigned y = 0;
while (n-- > 0) {
y = y*10 + x%10;
x /= 10;
}
return y;
}
对于 integer 类型的问题,请考虑 integer 辅助函数并避免像pow()
这样的浮点函数,因为它们可能只提供近似结果。 很容易编写 integer pow()
。
unsigned powu(unsigned x, unsigned expo) {
unsigned y = 1;
while (expo > 0) {
if (expo & 1) {
y = x * y;
}
expo >>= 1;
x *= x;
}
return y;
}
测试
int main() {
printf("%u\n", reverse_last_digits(12345, 3));
printf("%u\n", reverse_last_digits(523, 2));
printf("%u\n", reverse_last_digits(42001, 3));
printf("%u\n", reverse_last_digits(1, 2));
}
Output
12543
532
42100
10
代码使用unsigned
而不是int
来避免int
溢出时的未定义行为(UB)。
创建两个变量
lastn
存储最后 n 位 (345)r
存储反转的最后 n 位 (543) 从原始数字中减去lastn
(12345 - 345 = 12000)
将r
添加到上述数字(12000 + 543 = 12543)
int c = 0; // count number of digits
int original = x;
int lastn = 0;
while (x != 0 && c < n) {
r = r * 10;
r = r + x % 10;
lastn += (x % 10) * pow(10, c);
x = x / 10;
c++;
}
printf("reversed: %d\n", original - lastn + r);
It is an easy one.
1. let say the number you want to reverse is curr_number;
2. Now, the places you want to reverse is x;
(remember to verify that x must be less than the number of digit of curr_number);
3. now, just take a temp integer and store curr_number / pow(10,x) ('/' = divide and pow(10,x) is 10 to the power x)
4. now, take a second number temp2, which will store curr_number-(temp * pow(10,x) )
5. reverse this temp2 (using your function)
6. now, answer = (temp * pow(10,x) ) + (temp2) //(note temp2 is reversed)
步骤示例:
如果您在使用char
时没有问题,您可以这样做
#include <stdio.h>
#include <string.h>
#define SIZE 10
int main() {
char n[SIZE]; // the Number;
int x; // number of last digits of n to reverse
int len; // number of digits of n
scanf("%s%d", n, &x);
len = strlen(n);
for(int i = 0; i < len; i++) {
i < len - x ? printf("%c", n[i]) : printf("%c", n[2*len -1 - i - x]);
}
return 0;
}
如果您愿意,可以通过将for
分成两部分来使程序更具可读性
for(int i = 0; i < len - x; i++) {
printf("%c", n[i]);
}
for(int i = len-1; i >= len - x; i--) {
printf("%c", n[i]);
}
注意:如果 n > x 程序将不起作用(即,如果您想要交换的数字多于您得到的数字)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.