진 변환 HDU 2031 주의 - 2147483648 이 양수 로 변 한 후 int 메모리 로 넘 칩 니 다.

2118 단어 ACMHDU항주 전기

진 변환
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 29942    Accepted Submission(s): 16585
Problem Description
10 진수 N 을 입력 하여 R 진수 출력 으로 변환 합 니 다.
 
Input
입력 데 이 터 는 여러 개의 테스트 인 스 턴 스 를 포함 하고 모든 테스트 인 스 턴 스 는 두 개의 정수 N (32 비트 정수) 과 R (2 < = R < = 16, R < > 10) 을 포함 합 니 다.
 
Output
모든 테스트 인 스 턴 스 출력 변환 후의 수 를 위해 출력 마다 한 줄 을 차지 합 니 다.R 이 10 보다 크 면 해당 하 는 숫자 규칙 은 16 진법 (예 를 들 어 10 은 A 로 표시 하 는 등) 을 참고 합 니 다.
 
Sample Input

   
   
   
   
7 2 23 12 -4 3

 
Sample Output

   
   
   
   
111 1B -11

 
Author
lcy
 
c + + 를 사용 하면 함 수 를 직접 사용 할 수 있 습 니 다.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int a,b;
	char c[100];
	while(~scanf("%d%d",&a,&b))
	{
		if(a<0)
		{
			printf("-");
			a=-a;
		}
		itoa(a,c,b);
		strupr(c);
		puts(c);
	}
	return 0;
}

그리고 자신 이 쓰 면 0 과 - 2147483648 이라는 두 가지 데 이 터 를 주의해 야 합 니 다.
#include <iostream>
#include <cstring>

using namespace std;

long long N,R,k;//    
char number[1000];

int NintoR()
{
    int flag = 0,j = 0,mod;
    if(N < 0) {flag = 1;N = -1*N;}
    else if(N == 0) {number[j++] = '0';return j;}

    while(N != 0)
    {
        mod = N % R;
        if(mod < 10) number[j++]= mod + '0';
        else number[j++] = mod + 55;
        N = N / R;
    }
    if(flag) number[j++] = '-';
    return j;
}

int main()
{
    while(cin >> N >> R)
    {
        memset(number,'\0',sizeof(int)*100);
        k = NintoR();
        for(int i = k - 1;i >= 0; i--)
        cout << number[i];
        cout << endl;
    }
    return 0;
}

좋은 웹페이지 즐겨찾기