WZOI-289斜二进制数(shu)

题目描述:

当一个数是十进制数,每项的基数表现为10的k次方(数字是有限的,从左边到右边,最末的数字是10的0次方)。举例来说:
81307(10)=8×104+1×103+3×102+0×101+7×100
= 80000+1000+300+0+7
= 81307
当一个数是二进制数,每项的基数表现为2的k次方。举例来说:
10011(2)= 1×24+0×23+0×22+1×21+1×20
= 16+0+0+2+1.
= 19
在斜二进制中,我们定义shu为斜二进制数,每项的基数表现2的(k+1)次方减1。举例来说:
l0120(shu)=1×(25-1)+0×(24-1)+1×(23-1)+2×(22-1)+0×(21―1)
= 31+0+7+6+0
= 44

例如:最初10个数字在斜二进制中是0,1,2,10,11,12,20,100,101,102。
 

输入格式:

输入文件包括1行数据,一个斜二进制整数。
 

输出格式:

输出斜二进制数字的十进制值,要是超过2147483647,则输出"too long!"。
 

样例输入:

11

样例输出:

4

提示:

读入的数的长度<=100,用单个long long 变量是存储不了的。

建议用字符读入,存入字符数组中。

时间限制: 1000ms
空间限制: 64MB

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
	char n[1001];
	cin>>n;
	long long s=strlen(n),s1=0,a;
	long long b=s;
	for(long long i=0;i<s;i++){
		a=n[i]-'0';
		s1=s1+a*(pow(2,b)-1);
		b--;
	}
	if(s1>2147483647){
		cout<<"too long!";
	}else{
		cout<<s1;
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值