3、e");return0;}例2(ZOJ-1712):当一个数用10进制表示时,第kth位代表10^k的倍数.81307(10)=8*10^4+1*10^3+3*10^2+0*10^1+7*10^0=80000+1000+300+0+7=81307.当一个数用2进制表示时,第kth位代表2^k的倍数.10011(2)=1*2^4+0*2^3+0*2^2+1*2^1+1*2^0=16+0+0+2+1=19.现在出现一种特殊的进制,叫skew2进制.第kth位代表2^(k+1)-1的倍数.10120(skew)=1*(2^5-1)+0*
4、(2^4-1)+1*(2^3-1)+2*(2^2-1)+0*(2^1-1)=31+0+7+6+0=44.输入:有多种测试,每行有一个整数n,如果n=0停止测试.n是用skew进制表示的整数.输出:对每一个数,输出它的10进制表示.源代码:#include#includeintmain(){longintsum;inti,j,k;charp[100];scanf("%s",p);while(p[0]!='0'){sum=0;j=strlen(p);k=1;for(i=j-1;i>=0;i--){
5、k=k*2;sum=sum+(p[i]-'0')*(k-1);}printf("%ld",sum);scanf("%s",p);}return0;}例3(ZOJ-2371):考虑所有由非负的3的次方组成的集合.S={1,3,9,27,81,...}考虑由S的子集组成的序列(按子集里元素的总和递增排列).问题是找出在这个序列里第n-th个位置上的子集,并将它按元素递增的方向排列.输入:每行包含一个数n,并且n不超过19位.当n=0时,停止测试.输出:对每个n,输出第n-th个子集.输出格式如下.输入:11478311259009
6、816340490输出:{}{3,9}{3,9,27,6561,19683}{59049,3486784401,205891132094649,717897987691852588770249}分析:观察这个序列的前几项{},{1},{3},{1,3},{9},{1,9},{3,9},{1,3,9}。对于{1,3,9,27,81,...},1为第一位,3为第二位,9位第三位。如果把{}对应0(什么都没有);{1}对应1;{3}对应10;{1,3}对应11;{9}对应100;{1,9}对应101;{3,9}对应110;{1,3,9}
7、对应111。发现规律这个序列的每一项对应一个唯一的2进制码,且从左直右,连续递增。而2进制0,1,10,11,100,101,110,111。。。。。刚好对应10进制中的0,1,2,3,4,5,6,7,8。。。。。因此求第n-th个子集可以先把n转化成2进制的格式。且定义从右直左为第一位,第二位,第三位。。。。。。。在n的2进制格式里,那一位是1,就表示包含集合S{1,3,9,27,81,...}中的第几个元素。源代码:#include#include#includevoi
8、df(char*a,char*c){inti,j,ca,*s;ca=strlen(a);s=(int*)malloc(sizeof(int)*(ca+1));for(i=0;i