将整数拆分为两个单独的整数

Pra*_*eek 8 c reverse integer

假设我有

int n=123456;
int x,y=0;
Run Code Online (Sandbox Code Playgroud)

如何将整数"n"拆分为两半.

注意:总的位数n总是2的倍数,例如 1234,4567,234567,35621等...都有2,4,6,8位数.我想将它们分成两半.

我正在尝试使用以下代码,但它不起作用,y变量以某种方式保持反转的第二部分.

int x, y=0, len, digit;
int n=123456;

len=floor(log10(abs(n))) + 1;
x=n;
while((floor(log10(abs(x))) + 1)>len/2)
{
    digit=x%10;
    x=x/10;
    y=(y*10)+digit;
}
printf("First Half = %d",x);
printf("\nSecond Half = %d",y);
Run Code Online (Sandbox Code Playgroud)

当输入是:

N = 123456;

输出我得到:

上半场= 123
下半场= 654

我想要的输出:

上半场:123

下半场:456

Vla*_*cow 11

这是一个示范计划.它不使用除printf之外的任何函数.:)因此它是最简单的解决方案.

#include <stdio.h>

int main( void )
{
    unsigned int a[] = { 12, 1234, 123456, 12345678, 1234567890 };
    const unsigned int Base = 10;

    for ( size_t i = 0; i < sizeof( a ) / sizeof( *a ); i++ )
    {   
        unsigned int divisor = Base;
        while ( a[i] / divisor > divisor ) divisor *= Base;

        printf( "%u\t%u\n", a[i] / divisor, a[i] % divisor );
    }        
}
Run Code Online (Sandbox Code Playgroud)

程序输出是

1       2
12      34
123     456
1234    5678
12345   67890
Run Code Online (Sandbox Code Playgroud)

如果要使用带符号的整数类型和负数,则程序可以采用以下方式

#include <stdio.h>

int main( void )
{
    int a[] = { -12, 1234, -123456, 12345678, -1234567890 };
    const int Base = 10;

    for ( size_t i = 0; i < sizeof( a ) / sizeof( *a ); i++ )
    {   
        int divisor = Base;
        while ( a[i] / ( a[i] < 0 ? -divisor : divisor ) > divisor ) divisor *= Base;

        printf( "%d\t%d\n", a[i] / divisor, a[i] % divisor );
    }        
}
Run Code Online (Sandbox Code Playgroud)

它的输出是

-1      -2
12      34
-123    -456
1234    5678
-12345  -67890
Run Code Online (Sandbox Code Playgroud)