反转C中整数的最后n位
我需要写一个程序,取2位X和n,然后打印X,最后n位X反转 比如说 输入:123453 产出:12543 输入:5232 产出:532 我已经编写了一个控制机制,用于检查n是否大于或等于X的位数 例如,如果输入为6343和7,程序将打印应更改的输入并再次获取输入 我的主要问题是我找不到一个算法来反转最后n位。我可以用这个代码反转任何int反转C中整数的最后n位,c,C,我需要写一个程序,取2位X和n,然后打印X,最后n位X反转 比如说 输入:123453 产出:12543 输入:5232 产出:532 我已经编写了一个控制机制,用于检查n是否大于或等于X的位数 例如,如果输入为6343和7,程序将打印应更改的输入并再次获取输入 我的主要问题是我找不到一个算法来反转最后n位。我可以用这个代码反转任何int int X, r = 0; printf("Enter a number to reverse\n"); scanf(&qu
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);
但我想不出两个倒转的数字到底是多少。你能给我一些建议吗
创建两个变量
lastn,存储最后n位345
存储倒转的最后n位543的r
从原始数字12345-345中减去lastn=12000
将r加在上述数字12000+543=12543上
创建两个变量
lastn,存储最后n位345
存储倒转的最后n位543的r
从原始数字12345-345中减去lastn=12000
将r加在上述数字12000+543=12543上
示例和步骤:
当前编号=1234567
要反转的位置是3
temp=1234567/10^3,即1234567/1000=1234,因为它是int类型
temp2=1234567-1234*10^3,即1234567-1234000=567
反向567=765
答案=1234*10^3+765=1234765
示例和步骤:
当前编号=1234567
要反转的位置是3
temp=1234567/10^3,即1234567/1000=1234,因为它是int类型
temp2=1234567-1234*10^3,即1234567-1234000=567
反向567=765
答案=1234*10^3+765=1234765
如果使用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;
}
注意:如果n>x,该程序将不起作用,即,如果您想交换的数字多于您得到的数字,如果您在使用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;
}
注意:如果n>x,即如果您想交换的位数超过您所能交换的位数,则程序将不起作用
我不知道如何倒转最后的数字
使用pow10,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,并通过应用该位建立另一个整数。y=y*10+新数字
对于整数类型问题,请考虑整数辅助函数,避免像POW这样的浮点函数,因为它们只能提供近似结果。很容易编写一个整数pow
试验 输出12543
532
42100
10
代码使用unsigned而不是int来避免int溢出时的未定义行为
我不知道如何倒转最后的数字
使用pow10,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,并通过应用该位建立另一个整数。y=y*10+新数字
对于整数类型问题,请考虑整数辅助函数,避免像POW这样的浮点函数,因为它们只能提供近似结果。很容易编写一个整数pow
试验 输出12543
532
42100
10
代码使用unsigned而不是int来避免int溢出时的未定义行为。将输入值转换为char数组可能是最简单的方法,请修改该值,然后在需要时再转换回。另外,您的“n”变量未声明。除非这只是代码的一部分?或者,因为您的输入是一个字符串,所以首先不要麻烦将其转换为int。例如,不要使用scanf%d,…注意使用pow10,…的解决方案中的浮点问题,。。。这几乎是正确的答案。对于整数类型的问题,最好使用整数数学。将输入值转换为字符数组可能是最简单的方法,修改它,然后根据需要转换回。另外,您的“n”变量是未声明的。除非这只是代码的一部分?或者,因为您的输入是一个字符串,所以首先不要麻烦将其转换为int。例如,不要使用scanf%d,…注意使用pow10,…的解决方案中的浮点问题,。。。这几乎是正确的答案。对于整数类型的问题,最好使用整数数学。此赋值不支持使用pow。还有,为什么在x==0时停止?garble1,2应该返回10。此任务不允许使用pow。还有,为什么在x==0时停止?garble1,2应返回10。reverse_last_Digits 42001,3返回错误的值42001而不是42100,因为reverseu1返回1。reverse_last_Digits 42001,3返回错误的值42001而不是42100,因为reverseu1返回1。
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));
}
12543
532
42100
10