进制转化 poj1220 poj3191

来源:互联网 发布:wincc 用什么语言编程 编辑:程序博客网 时间:2024/05/09 11:01

Sample Input

862 2 abcdefghiz10 16 123456789012345678901234567890123456789016 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD235 23 333YMHOUE8JPLT7OX6K9FYCQ8A23 49 946B9AA02MI37E3D3MMJ4G7BL2F0549 61 1VbDkSIMJL3JjRgAdlUfcaWj61 5 dl9MDSWqwHjDnToKcsWE1S5 10 42104444441001414401221302402201233340311104212022133030

Sample Output

62 abcdefghiz2 1101110000010001011111001001011001111100100110001101001000110 123456789012345678901234567890123456789016 3A0C92075C0DBF3B8ACBC5F96CE3F0AD216 3A0C92075C0DBF3B8ACBC5F96CE3F0AD235 333YMHOUE8JPLT7OX6K9FYCQ8A35 333YMHOUE8JPLT7OX6K9FYCQ8A23 946B9AA02MI37E3D3MMJ4G7BL2F0523 946B9AA02MI37E3D3MMJ4G7BL2F0549 1VbDkSIMJL3JjRgAdlUfcaWj49 1VbDkSIMJL3JjRgAdlUfcaWj61 dl9MDSWqwHjDnToKcsWE1S61 dl9MDSWqwHjDnToKcsWE1S5 421044444410014144012213024022012333403111042120221330305 4210444444100141440122130240220123334031110421202213303010 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;elsec[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;elseans_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;}





0 0
原创粉丝点击