当前位置:编程学习 > C/C++ >>

九度OJ 教程62 大数处理之《进制转换》

 
[cpp]  
//九度OJ 教程62 大数处理之《进制转换》  
//http://ac.jobdu.com/problem.php?cid=1040&pid=61  
#include<stdio.h>  
#include<string.h>  
#define MAXS 3000  
typedef struct E{  
    int num[MAXS];//num[0]放个位,依次往右排。  
    int quan;  
    int lenth;  
}E;  
E spa;//这在main函数中,被置空。目的是为了置空其他大数的时候,可以直接令其=spa,省些事。  
int stack[MAXS];  
int count;  
E mul(int k,E x)//返回整数k与大数x的乘积  
{  
    int l=x.lenth,i;  
    for(i=0;i<=l;i++)x.num[i]*=k;  
    for(i=0;i<=l;i++)  
    {  
        x.num[i+2]+=x.num[i]/100;  
        x.num[i+1]+=x.num[i]/10%10;  
        x.num[i]%=10;  
    }  
    for(x.lenth+=2;x.num[x.lenth]==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[i]+=y.num[i];  
    }  
    for(i=0;i<=x.lenth;i++)  
    {  
        x.num[i+1]+=x.num[i]/10;  
        x.num[i]%=10;  
    }  
    for(x.lenth+=2;x.num[x.lenth]==0;x.lenth--);  
    return x;  
}  
E changeten(E sorce)//函数作用:处理ak这个大数与n这个整形数的乘积。  
{  
    E quan=spa,temp,ten=spa;  
    int i;  
    quan.num[0]=sorce.quan%10;  
    if(sorce.quan>=10)  
    {  
        quan.num[1]=sorce.quan/10;  
        quan.lenth=1;  
    }  
    ten.num[0]=sorce.num[0]%10;  
    ten.num[1]=sorce.num[0]/10;  
    ten.lenth=(ten.num[1]!=0);  
    for(i=1;i<=sorce.lenth;i++)  
    {  
        temp=mul(sorce.num[i],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[i-1]+=(sorce.num[i]%k)*10;//标记一下……回头试一下,是不是把这里的10改成sorce的权值,就可以直接不用转化成10进制再求了?  
            sorce.num[i]/=k;  
        }  
        stack[count++]=sorce.num[0]%k;  
        sorce.num[0]/=k;  
        for(;sorce.num[sorce.lenth]==0&&sorce.lenth;sorce.lenth--);  
    }  
    while(sorce.num[0])  
    {  
        stack[count++]=sorce.num[0]%k;  
        sorce.num[0]/=k;  
    }  
}  
int main()  
{  
    int i,j,l,b_quan;  
    char ha[MAXS];  
    for(i=spa.lenth=0;i<MAXS;i++)spa.num[i]=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]=='0'){printf("0\n");continue;}  
        for(i=0,j=l;i<j;i++,j--){char tempc=ha[i];ha[i]=ha[j];ha[j]=tempc;}  
        for(i=0;i<=l;i++)  
        {  
            if(ha[i]<='9'&&ha[i]>='0')a.num[i]=ha[i]-'0';  
            else a.num[i]=ha[i]-'A'+10;  
        }   
www.zzzyk.com
n(a);  
        divv(ten,b_quan);  
        for(i=count-1;i>=0;i--)  
        {  
            if(stack[i]<10)printf("%d",stack[i]);  
            else printf("%c",stack[i]-10+'a');  
        }  
        printf("\n");  
    }  
    return 0;  
}  
 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,