进制转换(大数)

问题 : 进制转换1

时间限制: 1 Sec  内存限制: 32 MB
提交: 15  解决: 8
[提交][状态]

题目描述

将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。

输入

多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)

输出

每行输出对应的二进制数。

样例输入

985
211
1126

样例输出

1111011001
11010011
10001100110

由于位数超出限制,所以要用大数,涉及大数除法和大数取余,注意输入为0的情况

#include<stdio.h>
#include<string.h>
#define N 200
int main()
{
	int i,sum,j,len,answer,point;
	char str[N];
	int ans[N],a[N];
	while(scanf("%s",str)!=EOF)
	{
		
		sum=0;j=0;
		len=strlen(str);
		if(len==1&&str[0]=='0')
		{
			printf("0\n");
			continue;
		}
		for(i=0;i<len;i++)
		a[i]=str[i]-'0';
		memset(ans,0,sizeof(ans));
		while(1)
		{
			answer=0;
			for(i=0;i<len;i++)
			if(a[i]!=0)
			{
				answer=1;
				break;
			}
			if(answer==0)
			break;
			sum=0;
			for(i=0;i<len;i++)
			{
				sum=sum*10+a[i];
				sum=sum%2;
			}
			ans[j++]=sum;
			point=0;
			for(i=0;i<len;i++)
			{
				a[i]+=point*10;
				point=a[i]%2;
				a[i]/=2;
			}
			
		}
		for(j--;j>=0;j--)
		printf("%d",ans[j]);
		printf("\n");
	}
	return 0;
}

另有一种简单的代码

#include<stdio.h>
#include<string.h>
int main()
{
    char a[50],c[550];
	int ans[50];
    int i,j,k,n,len,sum;
    while(scanf("%s",a)!=EOF)
    {
        len=strlen(a);
        j=0;
		c[j]='0';
		sum=1;
        for(i=0;i<len;i++)
           ans[i]=a[i]-'0';
        while(sum)
        {
            sum=0;
            for(i=0;i<len;i++)
            {
                k=ans[i]/2;
				sum+=k;
                if(i==len-1)
                    c[j++]=ans[i]%2+'0';
                else
                    ans[i+1]+=ans[i]%2*10;
                ans[i]=k;
            }
        }
        for(j--;j>=0;j--)
            printf("%c",c[j]);
        printf("\n");
    }
    return 0;
 } 

问题 : 进制转换2

时间限制: 1 Sec  内存限制: 32 MB
提交: 31  解决: 11
[提交][状态]

题目描述

将M进制的数X转换为N进制的数输出。

输入

输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。

输出

输出X的N进制表示的数。

样例输入

10 2
11

样例输出

1011

提示


注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。

#include<stdio.h>
#include<string.h>
#define N 1020
char map[40]="0123456789abcdefghijklmnopqrstuvwxyz";
int main()
{
    int m,n,i,j,sum,len,point,answer;
    char ans[N],str[N];
    int a[N];
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(ans,0,sizeof(ans));
        memset(a,0,sizeof(a));
        scanf("%s",str);
        len=strlen(str);
        if(len==1&&str[0]=='0')
        {
            printf("0\n");
            continue;
        }
        for(i=0;str[i]!='\0';i++)
        {
            if(str[i]>='A'&&str[i]<='Z')
                a[i]=str[i]-'A'+10;
            else a[i]=str[i]-'0';
        }
        j=0;
        while(1)
        {
            answer=0;
            for(i=0;i<len;i++)
            if(a[i]!=0)
            {
                answer=1;
                break;
            }
            if(answer==0)
            break;
            sum=0;
            for(i=0;i<len;i++)
            {
                sum=sum*m+a[i];
                sum=sum%n;
            }
            ans[j++]=map[sum];
            point=0;
            for(i=0;i<len;i++)
            {
                a[i]+=point*m;
                point=a[i]%n;
                a[i]/=n;
            }
        }
        for(j--;j>=0;j--)
        printf("%c",ans[j]);
        printf("\n");
    }
    return 0;
}

问题 : 10进制 VS 2进制

时间限制: 1 Sec  内存限制: 32 MB
提交: 6  解决: 5
[提交][状态]

题目描述

对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。

输入

一个1000位(即10^999)以内的十进制数。

输出

输入的十进制数的二进制逆序数。

样例输入

985

样例输出

623


#include<stdio.h>
#include<string.h>
#define N 1020
char map[40]="0123456789abcdefghijklmnopqrstuvwxyz";
int main()
{
    int m,n,i,j,sum,len,point,answer;
    char ans[N],str[N];
    int a[N];
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(ans,0,sizeof(ans));
        memset(a,0,sizeof(a));
        scanf("%s",str);
        len=strlen(str);
        if(len==1&&str[0]=='0')
        {
            printf("0\n");
            continue;
        }
        for(i=0;str[i]!='\0';i++)
        {
            if(str[i]>='A'&&str[i]<='Z')
                a[i]=str[i]-'A'+10;
            else a[i]=str[i]-'0';
        }
        j=0;
        while(1)
        {
            answer=0;
            for(i=0;i<len;i++)
            if(a[i]!=0)
            {
                answer=1;
                break;
            }
            if(answer==0)
            break;
            sum=0;
            for(i=0;i<len;i++)
            {
                sum=sum*m+a[i];
                sum=sum%n;
            }
            ans[j++]=map[sum];
            point=0;
            for(i=0;i<len;i++)
            {
                a[i]+=point*m;
                point=a[i]%n;
                a[i]/=n;
            }
        }
        for(j--;j>=0;j--)
        printf("%c",ans[j]);
        printf("\n");
    }
    return 0;
}


posted @ 2018-03-11 10:55  宿星  阅读(324)  评论(0编辑  收藏  举报