反转C中整数的最后n位

反转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

我需要写一个程序,取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("%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