redking 发表于 2013-9-1 02:05:25

大数处理之进制转换

//大数处理之进制转换
    //http://ac.jobdu.com/problem.php?cid=1040&pid=61
    #include<stdio.h>
    #include<string.h>
    #define MAXS 3000
    typedef struct E{
    int num;//num放个位,依次往右排。
    int quan;
    int lenth;
    }E;
    E spa;//这在main函数中,被置空。目的是为了置空其他大数的时候,可以直接令其=spa,省些事。
    int stack;
    int count;
    E mul(int k,E x)//返回整数k与大数x的乘积
    {
    int l=x.lenth,i;
    for(i=0;i<=l;i++)x.num*=k;
    for(i=0;i<=l;i++)
    {
    x.num+=x.num/100;
    x.num+=x.num/10%10;
    x.num%=10;
    }
    for(x.lenth+=2;x.num==0;x.lenth--);
    return x;
    }
    E add(E x,E y)//返回大数x与大数y的和。
    {
    int i;
    if(x.lenth<y.lenth){E temp=x;x=y;y=temp;}
    for(i=0;i<=y.lenth;i++)
    {
    x.num+=y.num;
    }
    for(i=0;i<=x.lenth;i++)
    {
    x.num+=x.num/10;
    x.num%=10;
    }
    for(x.lenth+=2;x.num==0;x.lenth--);
    return x;
    }
    E changeten(E sorce)//函数作用:处理ak这个大数与n这个整形数的乘积。
    {
    E quan=spa,temp,ten=spa;
    int i;
    quan.num=sorce.quan%10;
    if(sorce.quan>=10)
    {
    quan.num =sorce.quan/10;
    quan.lenth=1;
    }
    ten.num=sorce.num%10;
    ten.num =sorce.num/10;
    ten.lenth=(ten.num !=0);
    for(i=1;i<=sorce.lenth;i++)
    {
    temp=mul(sorce.num,quan);
    ten=add(ten,temp);
    quan=mul(sorce.quan,quan);
    }
    return ten;
    }
    void divv(E sorce,int k)
    {
    int i;
    count=0;
    while(sorce.lenth)
    {
    for(i=sorce.lenth;i;i--)
    {
    sorce.num+=(sorce.num%k)*10;//标记一下……回头试一下,是不是把这里的10改成sorce的权值,就可以直接不用转化成10进制再求了?
    sorce.num/=k;
    }
    stack=sorce.num%k;
    sorce.num/=k;
    for(;sorce.num==0&&sorce.lenth;sorce.lenth--);
    }
    while(sorce.num)
    {
    stack=sorce.num%k;
    sorce.num/=k;
    }
    }
    int main()
    {
    int i,j,l,b_quan;
    char ha;
    for(i=spa.lenth=0;i<MAXS;i++)spa.num=0;
    E a=spa,ten=spa;
    while(~scanf("%d",&a.quan))
    {
    scanf("%d",&b_quan);
    scanf("%s",ha);
    a.lenth=l=strlen(ha)-1;
    if(l==0&&ha=='0'){printf("0\n");continue;}
    for(i=0,j=l;i<j;i++,j--){char tempc=ha;ha=ha;ha=tempc;}
    for(i=0;i<=l;i++)
    {
    if(ha<='9'&&ha>='0')a.num=ha-'0';
    else a.num=ha-'A'+10;
    }
    n(a);
    divv(ten,b_quan);
    for(i=count-1;i>=0;i--)
    {
    if(stack<10)printf("%d",stack);
    else printf("%c",stack-10+'a');
    }
    printf("\n");
    }
    return 0;
    }

ilboyvm 发表于 2014-10-16 10:26:05

scanf("%d",&b_quan);
页: [1]
查看完整版本: 大数处理之进制转换