如何将右边第一步的每个数字置换?

时间:2014-02-22 14:03:54

标签: c++ primes

如何从给定的数字开始创建所有可能的数字,其中新数字的所有数字都向右移动一个插槽?例如,如果我们有1234.我想生成4123,3412和2341。

到目前为止我得到的是:

int move_digits(int a)
{
    int aux = 0;
    aux = a % 10;

    for(int i=pow(10, (number_digits(a) - 1)); i>0; i=i/10)
        aux = aux * 10 + ((a % i) / (i/10));
    return aux;
}

但它不起作用。

子程序number_digits看起来像这样(它只计算给定数字的位数):

int number_digits(int a)
{
    int ct = 0;
    while(a != 0)
    {
        a = a/10;
        ct++;
    }
    return ct;
}

4 个答案:

答案 0 :(得分:1)

我认为没有必要编写单独的函数number_digits。 我会写函数move_digits simpler

#include <iostream>
#include <cmath>

int move_digits( int x )
{
    int y = x;
    double n = 0.0;

    while ( y /= 10 ) ++n;   
    return ( x / 10 + x % 10 * std::pow( 10.0, n ) );
}

int main()
{
    int x = 1234;

    std::cout << x << std::endl;
    std::cout << move_digits( x ) << std::endl;
}

答案 1 :(得分:0)

  • 检索n的最后一位数字:n % 10
  • 要“切断”最后一位数字,您可以使用number / 10
  • 假设您有一个三位数的数字n,那么您可以使用d
  • 添加新数字1000 * d + n

那就是说,你可能想要计算

aux = pow(10, number_digits - 1) * (aux % 10) + (aux / 10)

答案 2 :(得分:0)

计算a/(number_digits(a) - 1)a%(number_digits(a) - 1)
你的答案是(a%(number_digits(a) - 1))*10 + a/(number_digits(a) - 1)

int i =0 ;
int len = number_digits(a);
while(i < len){
    cout << (a%(len - 1))*10 + a/(len - 1) <<endl;
    a = (a%(len - 1))*10 + a/(len - 1);
}

答案 3 :(得分:0)

void move_digits(int a)
{
    int digits = 0;
    int b = a;
    while(b / 10 ){
        digits++;
        b = b / 10;
    }

    for (int i = 0; i < digits; ++i)
    {
        int c = a / 10;
        int d = a % 10;
        int res = c + pow(10, digits) * d;
        printf("%d\n", res);
        a = res;
    }
    printf("\n");
}
int main()
{
    move_digits(12345);
}