#21-【数据类型范围】gift

200 篇文章 7 订阅
31 篇文章 0 订阅

Input

输入的第一行为一个整数t。 接下来t行,每行包含九个自然数a,b,c,d,e,f,g,h,i。

Output

输出t行,每行一个整数,表示2^a+2^b+2^c+2^d+2^e+2^f+2^g+2^h+i。

Sample Input

1 21 30 0 0 0 0 0 0 2147483647

Sample Output

3223322629

HINT

40%   t<=1000

100%  t<=100000 a,b,c,d,e,f,g,h<=60 i<=9223372036854775808

<分析>

刚看到这题的时候,大家都以为是恐怖的高精度。

有些大佬甚至把矩阵快速幂给搬出来了。

其实,这题并没有想象中的那么难。

既然a-h皆≤60,所以2^a+2^b+...+2^h的和≤2^63。

而i≤2^63,所以结果≤2^64。

而unsigned long long int的最大值是2^64-1,所以结果的最大值刚好超了一个。

那么,为什么不把这一个特殊情况列出来呢?

那么,这个问题就很容易解决了。

考察点:对数据类型范围的了解

 

#include <cstdio>

#define MAXUNSIGNEDLONGLONGINT 9223372036854775808

using namespace std;

int main(int argc, char** argv)
{
	int t, a, i;
	unsigned long long res, temp;
	bool flag;
	
	scanf("%d", &t);
	while (t--)
	{
		res = 0;
		flag = true;
		for (i = 0; i < 8; i++)
		{
			temp = 1;
			scanf("%d", &a);
			if (a != 60)
			{
				flag = false;
			}
			while (a--)
			{
				temp *= 2;
			}
			res += temp;
		}
		scanf("%llu", &temp);
		if ((flag) && (temp == MAXUNSIGNEDLONGLONGINT)) // 特殊情况,输出2^64
		{
			printf("18446744073709551616\n");
			continue;
		}
		res += temp;
		printf("%llu\n", res);
	}
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值