九度OJ 教程62 大数处理之《进制转换》
2013-02-21 13:34
246 查看
题目地址:http://ac.jobdu.com/problem.php?cid=1040&pid=61
//九度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; } ten=changeten(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; }
相关文章推荐
- //九度OJ教程65 大数处理之清华机试题 十进制VS二进制。
- //九度OJ 教程63 大数处理之浮点数加法
- poj 1220 java大数处理进制转换
- Scott Mitchell 的ASP.NET 2.0数据教程之三十八:: 处理BLL和DAL的异常
- TX Text Control文字处理教程(9)XML文件
- 用C处理大数相加问题
- 微信公众平台开发教程(八)Session处理问题
- 【Linux系列教程】02.命令基本格式、常见目录以及文件目录处理命令
- [置顶] 【Python NLP入门教程】词频统计和处理停用词,可视化
- Java处理大数
- 浅析C#的事件处理和自定义事件_C#教程
- 【OpenCV图像处理入门学习教程一】OpenCV2 + 3的安装教程与VS2013的开发环境配置 + JPEG压缩源码分析与取反运算修改
- 浅析C#的事件处理和自定义事件_C#教程
- ArcGIS教程:基于ArcGIS的栅格图像平滑处理
- Picasso入门教程(四) 如何处理空值(在ListView中)
- Ubuntu の 视频处理多面手 FFMPEG+AMR 编译配置教程
- SpringBoot初始教程之统一异常处理详解
- SpringBoot初始教程之日志处理(二)
- 区块链教程Fabric1.0源代码分析configupdate处理通道配置更新
- c#线程处理教程