zoukankan      html  css  js  c++  java
  • 数论——买不到的数

    问题描述

    小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

    小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

    你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。

    本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

    输入格式

    两个正整数,表示每种包装中糖的颗数(都不多于1000)

    输出格式

    一个正整数,表示最大不能买到的糖数

    样例输入1
    4 7
    样例输出1
    17
    样例输入2
    3 5
    样例输出2
    7
     
    #include<iostream>
    #include<cstring>
    #define MAX 10000000
    using namespace std;
    bool a[MAX];
    int x, y, res;
    void _solv()
    {
        cin >> x >> y;
        memset(a, 0, sizeof(a));
        a[0] = 1;
        for (int i = 1; i < MAX; i++){
            if (i >= x&&a[i - x])a[i] = 1;
            else if (i >= y&&a[i - y])a[i] = 1;
        }
        res = 0;
        for (int i = 1; i < MAX; i++){
            if (i>res&&!a[i])res = i;
        }
    }
    int main()
    {
        _solv();
        cout << res << endl;
    
        system("pause");
        return 0;
    }

    本质:从0开始,看x和y能否覆盖到这个数。

    按照蓝桥杯上给的提示,说欧几里得也能做,所以又试了一下,果然AC了!

    //用数论或欧几里得算法
    #include<iostream>
    #include<cstring>
    #define MAX 10000000
    using namespace std;
    bool a[MAX];
    int x, y, res;
    void _solv()
    {
        cin >> x >> y;
        memset(a, 0, sizeof(a));
        a[0] = 1;
        for (int i = 1; i < MAX; i++){
            if (i >= x&&a[i - x])a[i] = 1;
            else if (i >= y&&a[i - y])a[i] = 1;
        }
        res = 0;
        for (int i = 1; i < MAX; i++){
            if (i>res&&!a[i])res = i;
        }
    }
    int _test()
    {
        int i = 1;
        while (i){
            if (i == 5)return 5;
            i++;
        }
    }
    bool _Euclid(int a)
    {
        if (a <= 0)return false;
        if (a%y == x||a%y==0){
            return true;
        }
        else {
            return _Euclid(a - x);
        }
    }
    void _solv2()
    {
        cin >> x >> y;
        res = 0;
        int time = 0;
        for (int i = 1; i < MAX; i++){
            if (time == 10000)break;
            if (i>res && i%x!=0 && i%y!=0 && !_Euclid(i-x)){
                res = i;
                time = 0;
            }
            else{
                time++;
            }
        }
    }
    int main()
    {
        _solv();
        cout << res << endl;
        //cout<<_test();
        _solv2();
        cout << res << endl;
    
        system("pause");
        return 0;
    }

    只要注意一下连续time次未出现不能买到的数,就说明之后的数都可以买到了。可惜我不能证明!!!

    世上无难事,只要肯登攀。
  • 相关阅读:
    map用法详解
    求用1,2,5这三个数不同个数组合的和为100的组合个数
    【雅虎笔试题】两个已经排好序的数组,找中位数
    C++ STL算法系列4---unique , unique_copy函数
    C++ STL算法系列3---求和:accumulate
    C++ STL算法系列2---find ,find_first_of , find_if , adjacent_find的使用
    C/C++面试小知识点
    C语言内存地址基础
    C语言函数指针基础
    C++ STL算法系列1---count函数
  • 原文地址:https://www.cnblogs.com/littlehoom/p/3548642.html
Copyright © 2011-2022 走看看