文章目录
题目:
在skew 二进制数表示中,第k位的值xk 表示xk * (2k+1-1) 。每个位上的可能数字是0或1,最后面一个非零位可以是2,例如, 10120(skew) = 1 * (25-1) + 0 * (24-1) + 1 * (23-1) + 2 * (22-1) +0 * (21-1) = 31 + 0 + 7 + 6 + 0 = 44. 前十个skew 数是 0、1、2、10、11、12、20、100、101以及102。
输入格式:
输入包含一行或多行,每行包含一个整数n。如果n = 0 表示输入结束,否则n 是一个skew 数。
输出格式:
对于每一个输入,输出它的十进制表示。转换成十进制后, n 不超过 231-1 = 2 147 483 647。
输入样例:
10120
200000000000000000000000000000
10
1000000000000000000000000000000
11
100
11111000001110000101101102000
0
输出样例:
44
2147483646
3
2147483647
4
7
1041110737
解题代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char a[1000000]={};
long sum=0;
while(scanf("%s",a)!=EOF)
{
if(strlen(a)==1&&a[0]=='0') break;
for(int i=0;i<strlen(a);i++)
sum+=(a[i]-48)*(pow(2,strlen(a)-i)-1);
printf("%ld\n",sum);
a[1000000]={};
sum=0;
}
return 0;
}
pow函数简介:
sum+=(a[i]-48)*(pow(2,strlen(a)-i)-1);
1.介绍:原型在TC2.0中原型为extern float pow(float x, float y);
而在VC6.0中原型为double pow( double x, double y );
2.头文件:#include <math.h>
3.函数功能:计算x的y次幂
4.返回值:为double型,int,float会给与警告
注意:当x为负数且y为小数,或者x为0且y小于等于0,将出现结果错误
如果函数参数与要求类型不匹配,可以进行强制类型转换来达到目的