如何在没有数组的情况下旋转数字的n位数?

时间:2016-11-22 20:00:52

标签: c loops

问题:用户输入两个数字:一个大数字,一个小数字。 较小的数字是将转移到前面的最后一位数字的位数,其余数字将跟随。 例如:如果大数字是456789而小数字是3,结果将是:789456。 我的想法如下:

if(...) {
    newNum =  BigNumber%(10*SmallNumber);
    printf("%d", remainder");
     SmallNumber--; 
}

但它没有按照我希望的顺序打印,逐位数字,我无法理解为什么。 如果允许使用数组,那就没问题了。此外,我不允许使用string.length,这也使它更容易。

3 个答案:

答案 0 :(得分:2)

旋转数字可以作为剪切,移位和添加的组合执行。例如,如果您有一个123456789号码,并且需要按3进行轮播,则可以按以下步骤操作:

  • 切掉最后三位数字 123456 789
  • 将剩余数字移动三位数以生成123456 789
  • 将最后三位数字移动六来制作789000000
  • 将两个数字加在一起789000000 + 123456以获得结果789123456

以下是对十进制数字执行这些操作的方法:

  • 使用模k 10 k
  • 完成切断最后%个数字的操作
  • 向右移动k数字相当于整数除以10 k
  • 向左移k位相当于乘以10 k
  • 计算出一个数字中的有效位数可以通过重复整数除以十来完成。
  • 以常规方式进行添加。

答案 1 :(得分:0)

我认为以下代码可以帮助您 -

//Here size = number of digits in bignumber-1
while(smallnumber--) {
   temp = (bignumber - bignumber%pow(10,size))/(pow(10,size);
   bignumber  = bignumber%pow(10,size);
   bignumber = bignumber*10 + temp;
}

答案 2 :(得分:0)

试试这个版本:

#include <stdio.h>
#include <math.h>

int main(void)
{
  long int num = 34234239;
  int swap = 5, other;
  long int rem = num % (int)(pow(10,swap)); /*The part that is shifted*/
  other = log10(num-rem)+1-swap; /*Length of the other part*/
  /* Result = (part to shift)*(Other part's length) + (Other part)*(Shifts) */
  num = rem*(int)pow(10,other) + (num-rem)/(int)pow(10,swap);
  printf("%ld\n",num);

  return 0;
}