您的位置:首页 > 其它

成长轨迹42 【ACM算法之路 百炼poj.grids.cn】【数值转换】【2972、2798、2735、2734、2973】

2012-02-08 23:26 531 查看
一次ac的没啥好说、、、

2972:确定进制

#include<stdio.h>
#include<string.h>

int a1[10];
int b1[10];
int c1[10];
int main()
{
int t;
scanf("%d",&t);
for(int p=0;p<t;p++)
{
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
memset(c1,0,sizeof(c1));
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if( (c&&(a==0||b==0))||
(a==b&&b==c)||
(a==1&&b!=c)||
(b==1&&a!=c))
printf("0\n");
else
{
int na=0;
if(!a) na=1;//0也是1位
while(a)
{
a1[na]=a%10;
a/=10;
na++;
}

int nb=0;
if(!b) nb=1;
while(b)
{
b1[nb]=b%10;
b/=10;
nb++;
}

int nc=0;
if(!c) nc=1;
while(c)
{
c1[nc]=c%10;
c/=10;
nc++;
}
int a2,b2,c2;
int k;
for(k=2;k<1000000;k++)
{
if(na&&nb&&nc&&(k<=a1[na-1]||k<=b1[nb-1]||k<=c1[nc-1]))
continue;
//if(a1[0]*b1[0]!=c1[0])
//    continue;
//【这个不行,因为化成10进制时个位还是会跟原进制的其它位相关】
bool quit = false;
a2=a1[na-1];
for(int j=na-2;j>=0;j--)
{
a2*=k;
a2+=a1[j];
if(a1[j]>=k)
{
quit = true;
break;
}
}
if(quit)
continue;

b2=b1[nb-1];
for(int j=nb-2;j>=0;j--)
{
b2*=k;
b2+=b1[j];
if(b1[j]>=k)
{
quit = true;
break;
}
}
if(quit)
continue;

c2=c1[nc-1];
for(int j=nc-2;j>=0;j--)
{
c2*=k;
c2+=c1[j];
if(c1[j]>=k)
{
quit = true;
break;
}
}
if(quit)
continue;

if(a2*b2==c2)
{
printf("%d\n",k);
break;
}

}
if(k==1000000)
printf("0\n");
}

}
return 0;
}


2798:2进制转化为16进制

#include<stdio.h>
#include<string.h>

int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
char n16[3000];
char n[12000];
scanf("%s",&n);
int leng = strlen(n);
int len16 = (leng+3)/4;

for(int j=leng-4;j>-4;j-=4)
{
int a16=0;
for(int k=0;k<4;k++)
{
a16 *= 2;
if(j+k>=0)
a16+=(n[j+k]-'0');
}
if(a16>=10&&a16<=15)
n16[(j+3)/4]=char('A'+(a16-10));//【向上进位】
else
n16[(j+3)/4]=char('0'+a16);

}
for(int k=0;k<len16;k++)
{
printf("%c",n16[k]);//【注意改回使用数组元素,而非首地址,否则会出来奇怪的字符】
}
printf("\n");
}
return 0;
}


2735:八进制到十进制

#include<stdio.h>
#include<string.h>

int main()
{
int a;
scanf("%d",&a);
int a10=0;
int mult=1;
while(a)//【越低位乘得越少!!】
{
a10+=mult*(a%10);
mult*=8;
a/=10;
}
printf("%d\n",a10);
return 0;
}


2734:十进制到八进制

#include<stdio.h>
#include<string.h>

int main()
{
int a;
scanf("%d",&a);
int a8=0;
int mult=1;
while(a)//【越低位乘得越少!!】
{
a8+=mult*(a%8);
mult*=10;
a/=8;
}
printf("%d\n",a8);
return 0;
}


2973:Skew数

#include<stdio.h>
#include<string.h>

char n[35];
int main()
{
while(1)
{
int skew=0;
scanf("%s",&n);
int leng = strlen(n);
if(leng==1&&n[0]-'0'==0)
break;

int power=2;
skew=n[leng-1]-'0';//【记得减‘0’!】
for(int i=leng-2;i>=0;i--)
{
power*=2;
skew+=((n[i]-'0')*(power-1));
}
printf("%d\n",skew);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐