题解【P6581 远大目标】

基本简介

    • 1.思路
    • 2. l o n g l o n g \mathsf{longlong} longlong无法存储 2 64 \mathsf{2^{64}} 264怎么办
    • 3. C + +   A C   C o d e \mathsf{C++\ AC\ Code} C++ AC Code:

1.思路

思路:负数有-1~-x-1有x-1个,正数有1~x-1也有x-1个,最后还有0算1个。

另外还要注意如果数字小于等于0时应该为0(我就因为这个而WA)

所以:如果 O ≤ 0 O \leq 0 O0时, g e s h u ( A ) geshu(A) geshu(A)为0,否则, g e s h u ( A ) geshu(A) geshu(A) ( O − 1 ) × 2 + 1 (O-1) \times 2 +1 (O1)×2+1

2. l o n g l o n g \mathsf{longlong} longlong无法存储 2 64 \mathsf{2^{64}} 264怎么办

先看下题目数据范围, 2 63 \mathsf{2^{63}} 263long long都不够!

但是这题并不需要什么高精度,只需要unsigned long long就OK了。

unsigned 是一种无符号整型。

众所周知,数字分成正整数负整数,在计算机中,最高二进制位是符号位(如果有一占4个比特的类型(一个类型数据最高占多少个二进制位就有多少个字节)),那么:

题解【P6581 远大目标】_第1张图片

其中,符号位如果为0,就是正数,为1则为负数。

在溢出的时候,迫不得己把符号位也占了。(如果溢出太多也不是负数)

所以,上边占4个比特的数字转换10进制是-7,而不是9

注意:如果溢出时,是以补码的形式出现的(补码计算方式:符号位为1,其余各位求反,末位加1),所以,-7是以下图方式得来的:

题解【P6581 远大目标】_第2张图片

但,unsigned却把最高位符号位变成数字了。

大家可能不明白我在说什么,就是计算机处理的时候,不看符号位了,而是直接把符号位也转换为10进制了

加了unsigned是9(如下图)

题解【P6581 远大目标】_第3张图片

这样,难关轻松解决,现在扩大至 2 64 − 1 2^{64}-1 2641

3. C + +   A C   C o d e \mathsf{C++\ AC\ Code} C++ AC Code:

#include
using namespace std;
int main(){
	long long n;
    unsigned long long x;//无符号longlong
	cin>>n;
	if(n<=0){cout<<0;return 0;}//特例
	x=(n-1)*2+1;//N代表O
	cout<<x;
	return 0;
}

你可能感兴趣的:(OJ,算法,luogu月赛)