题目描述
给定一个长度为64的序列A=(A\_0,A\1,\dots,A\{63})A=(A_0,A_1,...,A_63),由0和1组成。
求A\_0 2^0 + A\1 2^1 + \dots + A\{63} 2^{63}A_020+A_121+⋯+A_63263。
约束条件
- A\_iA_i是0或1。
输入
从标准输入中以以下格式给出输入:
A_0A0 A_1A1 \dots... A_{63}A63
输出
将答案作为整数打印出来。
样例输入1
1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
样例输出1
13
A\_0 2^0 + A\1 2^1 + \dots + A\{63} 2^{63} = 2^0 + 2^2 + 2^3 = 13A_020+A_121+⋯+A_63263=20+22+23=13。
样例输入2
1 0 1 0 1 0 0 0 0 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0
样例输出2
766067858140017173
这道题我本来思路就是一步一步来找。
如果找到一个一,就把它加上二但当前坐标减一的方
初始代码如下,
不要尝试,只能得8分。
#include <bits/stdc++.h>
using namespace std;
long long ans;
int main(){
for(int i=0;i<64;++i){
int x;
cin>>x;
if (x==1)
ans+=pow(2,i);
}
cout<<ans<<endl;
return 0;
}
当我百无头绪的时候,我看到这句话。
当 a 向左移动 i 位时,a 最左边的 i 位会被舍弃,同时在最右边补 i 个 0。
从数值层面来说,把一个数左移 i 位,相当于该数乘以 2 的 i 次方,即 a << i 等同于 a * (2^i)。
所以说我们现在就可以用左移来做这道题。
第二次代码如下,
同样不要尝试只能得五十八分
#include <bits/stdc++.h>
using namespace std;
long long ans=0,ji=1;
int main(){
for(int i=0;i<64;++i){
int x;
cin>>x;
if (x==1)
ans+=ji;
ji <<= 1;
}
cout<<ans<<endl;
return 0;
}
这时我注意到long,long可能还是太小了。
于是我又看到了这个
unsigned long long int
这是c++里最大的存储单位。
于是就有了最终的满分代码
#include <bits/stdc++.h>
using namespace std;
unsigned long long int ans=0,ji=1;
int main(){
for(int i=0;i<64;++i){
int x;
cin>>x;
if (x==1)
ans+=ji;
ji <<= 1;
}
cout<<ans<<'\n';
return 0;
}
此篇结束。