숫자 블록 재정렬
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;
}