高精度、位运算—杀鸡还是杀猴
Description
师徒西游开始后的第P年,师徒4人来到凤仙郡后,目睹这里连续干旱了三年,一片惨状,孙悟空当即吹出牛皮,和郡守保证能求来雨水。谁知把东海龙王敖广喊过来后,敖广怎么也不敢施法降雨,非得让孙悟空去天庭请旨。孙悟空很没面子,二话不说上了天庭。
玉帝命人在披香殿立了一座十丈高的米山,旁边放一只土公鸡在不断的啄米,另一座二十丈高的面山,放一只狗也在不断的舔面,要等鸡吃完了米或者狗吃完了面,玉帝肯让降雨。已知,鸡吃完米要整数N年,狗吃完面要整数M年。
孙悟空知道杀鸡敬狗这个典故,他决定杀掉吃的比较慢的动物,让另一只吃的更快,当两只动物吃的时间一样慢的时候,由于孙悟空讨厌狗所以他会先杀狗,但如果P是2的幂的时候,孙悟空将会放过狗先杀鸡,请问孙悟空应该先杀鸡还是杀狗?
当孙悟空应该杀狗的时候输出“dog”(不包含引号),当孙悟空应该杀鸡的时候输出“chicken”(不包含引号)
注意:天上的神仙可以活很长时间,N,M的数值可能会很大
Input
第一行 输入一个整数 P ,表示现在是西游开始之后的P年( 0 ≤ P ≤ 1000)
第二行 输入两个整数 N ,M 分别表示鸡狗吃完所用的年份(0<N,M<=1010086)
Output
第一行 输出一串字符 str 表示孙悟空应该杀鸡还是杀狗?
Sample Input
1
12 23
Sample Output
dog
分析:
这道题虽然题干较长,但是考察的内容简单,就是判断大小,判断是否是2的幂,第一步就是判断N,M的大小;通过数据范围可以看到,N,M远超long long 可以表示的范围,所以就属于一个高精度的大小比较,需要利用string来输入数字,在利用数组去比较二者大小;第二步就是判断p是否为2的幂,这里利用位运算介绍一种快速的判断方法。
2-----10 2-1-----01 2的x次幂的二进制表示必为最高位是1,其余位全为0;减1后则最高
4-----100 4-1-----011 位为0,其余全为1;相与的结果一定为0。
8-----1000 8-1-----0111 ↓
16----10000 16-1----01111 n ---00......0
32----100000 32-1----011111 n-1--011......1
进行与运算——> n&(n-1)---000......0
代码实现
#include <iostream>
#include <vector>
using namespace std;
bool check(int n) {
return n > 0 && (n & (n - 1)) == 0;//注意运算优先级要加括号
}
int cmp(const vector<int>& n, const vector<int>& m) {
if (n.size() > m.size()) return 1;
if (n.size() < m.size()) return -1;
for (int i = 0; i < n.size(); i++) {
if (n[i] > m[i]) return 1;
if (n[i] < m[i]) return -1;
}
return 0;
}
int main() {
int p;
string n, m;
cin >> p >> n >> m;
vector<int> N(n.size());
vector<int> M(m.size());
for (int i = 0; i < n.size(); i++)
N[i] = n[i] - '0';
for (int i = 0; i < m.size(); i++)
M[i] = m[i] - '0';
if (cmp(N, M) == -1)
cout << "dog";
else if (cmp(N, M) == 1)
cout << "chicken";
else {
if (check(p))
cout << "chicken";
else
cout << "dog";
}
return 0;
}
比较大小的时候直接用bool类型加上return 判断会省事些,参考代码
bool cmp(vector<int> &A ,vector<int> &B)
{
if(A.size() !=B.size() )
return A.size() > B.size() ;
for(int i = A.size() - 1 ; i >= 0 ; i -- )
if(A[i] != B[i] ) return A[i] > B[i];
cnt = 1 ;
return true ;
}
注意:单纯定义的数组,不能用a.size()来获取长度,可以借助c语言里的sizeof(a)来获取总的字节长度再除以一个数组元素的字节长度sizeof(a[0])就是数组长度。

浙公网安备 33010602011771号