高精度、位运算—杀鸡还是杀猴

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])就是数组长度。

posted @ 2023-07-23 05:32  LongDz  阅读(21)  评论(0)    收藏  举报