어떻게 putchar
의 도움으로 정수를 인쇄 할 수 있습니까? 나는 외부 저장 장치를 사용하지 않고 그것을하고 싶다.
이 질문은 작년 인터뷰에서 질문되었습니다.putchar은 정수를 출력 할 수 있습니까?
답변
인터뷰에서 애매한 요구 사항에 직면했을 때 가정을 표현하는 것이 좋습니다.
putchar
만을 사용할 수 있다는 요구 사항은 내가 호출 할 수있는 유일한 라이브러리 함수라는 것을 의미합니다. 또한 "외부 저장소가 없다"는 것은 명시 적으로 버퍼를 만들 수 없다는 것을 의미한다고 생각합니다. 면접관은 다음 n = -n;
이 INT_MIN
실패 할 것이라고 논평 경우 아래에 언급 한 바와 같이,
void pr_int(int n) {
if (n < 0) {
putchar('-');
n = -n;
}
if (n/10 != 0)
pr_int(n/10);
putchar((n % 10) + '0');
}
그때로 다시 것 : 면접관 내 가정에 동의하는 경우, 나는 계속 것
void pr_uint(unsigned int n) {
if (n/10 != 0)
pr_uint(n/10);
putchar((n % 10) + '0');
}
void pr_int(int n) {
if (n < 0) {
putchar('-');
n = -n;
}
pr_uint((unsigned int) n);
}
'n = -n'은 INT_MIN에 대해 실패합니다. –
+1 H2CO3 :하지만 n = -n; ** ** MAY ** 실패. C 표준은 실패하지 않는 구현을 허용합니다 :-) 물론 – pmg
@pmg :) –
이미 이와 비슷한 질문이있었습니다. 대답했습니다. this.
putchar 만 사용하여 프로그램으로 변환하는 것이 쉽습니다 (예 :
while(buf[i])
putc(buf[i++]);
putc('\n');
왜 downvote입니까? –
나는 무서운 무언가를 조립했습니다. 그것은 대부분 개념 증명이며, 은 실제로 무서운입니다. 양의 정수로만 작동하지만 거의 저장하지 않습니다. 아, 그리고 정수는 너무 커질 수 없으며, 버그가있을 수 있습니다.
#include <stdio.h>
#include <assert.h>
int main()
{
const int max_precision = 100000;
int b = 7414;
int max = b * max_precision;
assert(b > 0);
while (b <= max && b >= 0)
{
putchar('0' + (b/max_precision) % 10);
b *= 10;
}
putchar('\n');
}
max_precision
인쇄 할 자릿수를 설정합니다. b
은 실제 숫자를 저장하고 max
은 루프를 종료하는 데 사용됩니다 (해당 오버플로 또는 정수 오버플로).
이 질문에 대한 대답은 "외부 저장소"와 "putchar
"의 의미에 따라 크게 달라질 수 있습니다. C99 섹션 6.5.5 P6 바와 같이
void print_int_r (int x, int neg) {
int y = x/10;
int d = x%10;
if (y) print_int_r(y, neg);
putchar('0' + (neg ? -d : d));
}
void print_int (int x) {
int neg = x < 0;
if (neg) putchar('-');
print_int_r(x, neg);
putchar('\n');
}
상기 구현은 C99 의미를 가정
정수 분할되면
/
연산자의 결과를 폐기 소수부와 대수 몫이고 .a/b
의 지수를 나타낼 수있는 경우(a/b)*b + a%b
은a
과 같아야합니다.
그러나 %
에 대한 ANSI C (C 89) 의미는 더 나쁩니다. ANSI C 3.3 절.5 P5라고 : 피연산자가 /
연산자의 결과는 대수 몫 또는 대수 지수보다 큰 가장 작은 정수보다 큰 정수 이하인지 음수
경우 부호이기 때문에 구현 정의이고
%
연산자의 결과 중 하나입니다.
Ferruccio의 두 번째 대답은 거의 완벽합니다. 문제는 변환이 올바르지 않다는 것입니다. 연산 결과가 int
으로 표시 할 수없는 값인 경우 n = -n
의 결과는 정의되지 않습니다. 따라서 전환은 다음과 같이 수행되어야합니다.
그리고 솔루션은 현재 모든 ISO C 표준을 준수합니다. 세부 사항은 here입니다.
- 1. 읽기 정수를 출력 할 수 없습니다 : java
- 2. 정수를 10 진수로 변환 할 수 있습니까?
- 3. 거대한 정수를 병렬 처리 할 수 있습니까?
- 4. 프록시 유형의 정수를 생성 할 수 있습니까?
- 5. 이 정수를 printf를 사용하여 다음 형식의 float 형식으로 출력 할 수 있습니까?
- 6. 증가하는 동안 동일한 출력 라인에서 정수를 반향합니까?
- 7. XMLStreamWriter의 출력 스트림에서 "jump"할 수 있습니까?
- 8. TypeScript에서 javadoc 주석을 출력 할 수 있습니까?
- 9. snort 로그를 데이터베이스로 출력 할 수 있습니까?
- 10. 일반 출력 유형을 추론 할 수 있습니까?
- 11. 변수의 이름을 출력 할 수 있습니까?
- 12. xslt에서 전체 XML을 출력 할 수 있습니까?
- 13. Grails 1.3.7에서 JSON을 출력 할 수 있습니까?
- 14. 정수를 바이트 배열로 이진수로 인코딩 할 수 있습니까?
- 15. ActionScript/Flex 3에서 (부호없는) 정수를 어떻게 해제 할 수 있습니까?
- 16. 소켓 프로그램에서 정수를 추가 할 수 있습니다.
- 17. 출력 정수를 두 개의 값으로 나눕니다.
- 18. 문자열을 파싱하여 정수를 구분할 수 있습니까? Java
- 19. 문자열과 정수를 같은 배열에 넣을 수 있습니까?
- 20. 아이폰 애플리케이션에서 정수를 어떻게 나눌 수 있습니까?
- 21. 하스켈은 인트 대 정수를 무시할 수 있습니까?
- 22. Perl에서 정수를 여러 모듈로 가져올 수 있습니까?
- 23. 정수를
- 24. 임의의 정수를 생성 할 때 상한을 포함 할 수 없습니다.
- 25. android - 정수로 명백한 정수를 구문 분석 할 수 없습니다.
- 26. SQL XML을 사용하여 각 레코드를 삽입하고 출력 할 수 있습니까?
- 27. Django의 ORM이 사용중인 SQL 쿼리를 출력 할 수 있습니까?
- 28. ToString() 메서드를 재정 의하여 목록을 출력 할 수 있습니까?
- 29. IzPack, 단일 실행 가능 병을 출력 할 수 있습니까?
- 30. 어떻게하면 Twig에서 엔티티로 HTML을 출력 할 수 있습니까?
Btw,이 인터뷰 담당자가 2013 IOCCC 준비 중이라고 생각 했습니까? –
"외부 저장소를 사용하지 않고"는 무엇을 의미합니까? –
@MichaelBurr 나는 면접관이 변수를 사용하지 않는다는 것을 의미한다고 생각합니다. 나는 혼란 스럽습니다. – akash