原题大意:
如果一个数是十进制值,那么可以表示为10120(10)=1*10^4+0*10^3+……+0*10^0;
如果是二进制的,那么可以表示为10120(2)=1*2^4+……+0*2^0;
现在定义斜二进,那么可以表示为10120(skew) = 1 * (2^5-1) + 0 * (2^4-1) + 1 * (2^3-1) + 2 * (2^2-1) + 0 * (2^1-1)
= 31 + 0 + 7 + 6 + 0
= 44.
输入斜二进制数,遇0结束。
输出十进制。
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
char b[50];
char *s="0";
int i;
while(scanf("%s",b),strcmp(b,s))
{
int n=strlen(b),c=n;
double d=0;
for(i=0;i<n;i++)
d+=(b[i]-'0')*(pow(2,c--)-1);
printf("%.0f\n",(d));
}
}
代码中运用都逗号表达式,简化了遇0 结束时的代码。
但是注意这道题目如果你想用int的%d方式输出,结果会出错。
为什么?,很简单。因为int如果未强调其是否有符号。正数最大值只有为(2^32-1)/2;
所以这样就会在第三数据出错,那么用无符号的unsigned就行了,确实用这样就行le
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
char b[50];
char *s="0";
int i;
while(scanf("%s",b),strcmp(b,s))
{
int n=strlen(b),c=n;
double d=0;
for(i=0;i<n;i++)
d+=(b[i]-'0')*(pow(2,c--)-1);
printf("%d\n",unsign int(d));
}
}
但是如果这样的话,poj就报你错,它并不识别unsigned int;
也就是他的系统不是vc,估计gcc下只能用第一个。