鱼C论坛

 找回密码
 立即注册
查看: 2316|回复: 1

[技术交流] 大数处理之进制转换

[复制链接]
发表于 2013-9-1 02:05:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//大数处理之进制转换
    //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 =sorce.quan/10;
    quan.lenth=1;
    }
    ten.num[0]=sorce.num[0]%10;
    ten.num =sorce.num[0]/10;
    ten.lenth=(ten.num !=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;
    }
    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;
    }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-16 10:26:05 | 显示全部楼层
scanf("%d",&b_quan);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 03:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表