进制转化 poj1220 poj3191

Sample Input

8
62 2 abcdefghiz
10 16 1234567890123456789012345678901234567890
16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 23 333YMHOUE8JPLT7OX6K9FYCQ8A
23 49 946B9AA02MI37E3D3MMJ4G7BL2F05
49 61 1VbDkSIMJL3JjRgAdlUfcaWj
61 5 dl9MDSWqwHjDnToKcsWE1S
5 10 42104444441001414401221302402201233340311104212022133030

Sample Output

62 abcdefghiz
2 11011100000100010111110010010110011111001001100011010010001

10 1234567890123456789012345678901234567890
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2

16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 333YMHOUE8JPLT7OX6K9FYCQ8A

35 333YMHOUE8JPLT7OX6K9FYCQ8A
23 946B9AA02MI37E3D3MMJ4G7BL2F05

23 946B9AA02MI37E3D3MMJ4G7BL2F05
49 1VbDkSIMJL3JjRgAdlUfcaWj

49 1VbDkSIMJL3JjRgAdlUfcaWj
61 dl9MDSWqwHjDnToKcsWE1S

61 dl9MDSWqwHjDnToKcsWE1S
5 42104444441001414401221302402201233340311104212022133030

5 42104444441001414401221302402201233340311104212022133030
10 1234567890123456789012345678901234567890


题目意思就是:在T组数据中,从进制m转化为进制n

#include<stdio.h>
#include<string.h>

int n,m;
char a[555],ans_str[555];
int c[555];
int ans_int[555];

int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%s",&n,&m,a);
//-----------------------------------------//
		if(a[0]=='0'){
			printf("%d %s\n%d 0\n\n",n,a,m);
			continue;
		}
//-----------------------------------------//
		for(int i=0;i<strlen(a);i++){
			if(a[i]>='A'&&a[i]<='Z')
				c[i]=a[i]-'A'+10;
			else if(a[i]>='a'&&a[i]<='z')
				c[i]=a[i]-'a'+36;
			else
				c[i]=a[i]-'0';
		}
//-----------------------------------------//
		int pos=0;
		while(pos<555)
		{
			int ans=0;
			for(int i=0;i<strlen(a);i++){
				ans=ans*n+c[i];
				c[i]=ans/m;
				ans=ans%m;
			}
			ans_int[pos++]=ans;
		}
//-----------------------------------------//
        memset(ans_str,'0',sizeof(ans_str[0]));
		for(int j=0;j<pos;j++){
			if(ans_int[j]>=10&&ans_int[j]<=35)
				ans_str[pos-j-1]=ans_int[j]+'A'-10;
			else if(ans_int[j]>=36&&ans_int[j]<=61)
				ans_str[pos-j-1]=ans_int[j]+'a'-36;
			else
				ans_str[pos-j-1]=ans_int[j]+'0';
		}
//-----------------------------------------//
		printf("%d %s\n%d ",n,a,m);
		int tag=1;
		for(int i=0;i<pos;i++){
			if(ans_str[i]=='0'&&tag)
				continue;
			if(ans_str[i]!='0')
				tag=0;
			printf("%c",ans_str[i]);
		}
		puts("\n");
//-----------------------------------------//
	}
	return 0;
}

代码中需要注意的是:

		int pos=0;
		while(pos<555)
		{
			int ans=0;
			for(int i=0;i<strlen(a);i++){
				ans=ans*n+c[i];
				c[i]=ans/m;
				ans=ans%m;
			}
			ans_int[pos++]=ans;
		}
这里是同余求模定理

可以见我的另外的一片bloghttp://blog.csdn.net/summer__show_/article/details/50716283


题意:把一个int型的十进制的转化位一个-2进制的数

解析:

例如:

      把 -6 进制的123数字转化为十进制的数

                   1 * (-6)*(-6)+2*(-6)+3

反之,将负进制转化位正进制

       找到一个最小的非负整数 x 使得当前数减去x能被6 整除,这个x将被作为最新的最高位写到结果中

    然后这个数减去x  除以 -6 ,循环做这两步即可


#include<stdio.h>
#include<string.h>

int main()
{
	int a;
	int ans[1005];
	scanf("%d",&a);
    if(a==0){
        printf("0\n");
        return 0;
    }

    memset(ans,0,sizeof(ans));
    int i=0;
    while(a)
    {
        ans[i]=a%2;
        if(ans[i]<0)
            ans[i]=-ans[i];
        a-=ans[i];
        a/=(-2);
        i++;
    }
    for(int j=i-1;j>=0;j--)
        printf("%d",ans[j]);
	return 0;
}





你可能感兴趣的:(进制转化 poj1220 poj3191)