숫자 블록 재정렬

Nov 14 2020

"재귀 함수를 사용하여 두 블록의 정수에서 자릿수를 재정렬"하는 대답을 모르는 어려운 질문이 발생했습니다. 여기에 예가 있습니다.

입력 : 123456

unsigned long pairinvPrint(unsigned long number) {
    printf("%d", number % 100);

    if ((number / 100) <= 99) {
        printf("%d", number / 100);
    }
    else {
        pairinv(number / 100);
    }
}

출력 : 563412
추가 I / O 예 : 42-> 42; 1234-> 3412

그러나이를 수행하는 설정 환경은 어렵고 (루프, 배열, 포인터, 전역 또는 정적 변수, 라이브러리 없음) 솔루션을 직접 인쇄해서는 안되며 다음과 같은 호출시 반환해야합니다.

printf("Rearrange int (%lu) = %lu", input, pairinvert(input));

운 좋게도 쉽게 만들 수있는 한 가지 상황이 있습니다. 입력 자릿수는 항상 짝수입니다.

이제 잠시 실험했지만 .NET을 사용하는 잘못된 솔루션을 제외하고는 작동하는 솔루션을 찾을 수 없습니다 printf.

누구든지 나에게 영감을 주거나 이것을 해결하는 방법을 알고 있습니까?

답변

1 pmg Nov 14 2020 at 17:53

물어 볼게요 :-)

unsigned long p(unsigned long p1, unsigned long p2) {
    // no loops, no arrays, no pointers, no global, no static, no variables, no libraries
    if (p1 < 100) return p2*100 + p1;
    return p(p1/100, p2*100 + p1%100);
}

unsigned long pairinvert(unsigned long n) {
    // no loops, no arrays, no pointers, no global, no static, no variables, no libraries
    if (n < 100) return n;
    return p(n/100, n%100);
}

// need <stdio.h> for printf()
#include <stdio.h>

int main(void) {
    unsigned long input;
    input = 123456;
    printf("Rearrange int (%lu) = %lu\n", input, pairinvert(input));
    input = 42;
    printf("Rearrange int (%lu) = %lu\n", input, pairinvert(input));
    input = 1234;
    printf("Rearrange int (%lu) = %lu\n", input, pairinvert(input));
}
Shiv Nov 14 2020 at 17:26

다음 프로그램이 작동합니다.

#include <stdio.h>

void rearrange(int n, int *output) {
    int lsd = 0, slsd = 0;

    if(n == 0)
      return;
    if(n > 0) {
        lsd = n%10;
    }
    if (n > 9) {
        slsd = (n%100)/10;
    }

    *output = 100*(*output) + 10*slsd + lsd;

    n = n/100;

    rearrange(n, output);
}

int main() {
    int n;
    int output = 0;

    scanf("%d", &n);
    rearrange(n, &output);
    printf("%d\n", output);

    return 0;
}

이해하기 쉽기 때문에 코멘트를 쓰지 않습니다.

꼬리 재귀 적이므로 O2 최적화를 사용하면 무한 재귀 할 수 있습니다.

dspr Nov 14 2020 at 17:41

이 시도 :

unsigned long pairinv(unsigned long number, unsigned long result) {

    unsigned long n = number % 100;   // Gets the two digit number
    if (n == 0) return result;        // If it's zero returns the result

    result = result * 100 + n;        // Else multiplies the result by 100, adds n
    return pairinv(number / 100, result); // and continues by recursion
}

int main() {
    unsigned long  r= 0;
    printf("%lu\n", pairinv(123456, r)); //==> 563412
    return 0;
}