1 solutions

  • 0
    @ 2024-1-9 15:35:56

    题意为给出范围内有多少个数字含有“12”。 本题用python做很简单,就是遍历范围内的所有数字,每个都转换成数字字符串,然后使用in关键字判断子串“12”在不在里面。 主要说的是C++的做法。因为最大为四位数,所以我们只需要判断数字的第3,4位,2,3位,1,2位是否为“12”。3,4可以由对100取余得到;2,3位可以由除以10再取余100,或者取余1000再除以10得到;第1,2位可以由除以100得到。 分别对每个数字判断这三种情况是否存在一个等于12就好了。注意原本有多少位数并不不影响取余和除法操作。 C++核心参考代码:

    bool check(int x)// 把判断封装成函数
     {
     	if (x % 100 == 12)// 34位是否为12
     		return 1;
     	if (x / 100 == 12)// 12位是否为12
     		return 1;
     	if (x / 10 % 100 == 12)// 23位是否为12
     		return 1;
     	return 0;// 没有任何一个满足就返回false
     }
    
    
    inline void solve()
    {
    	int ans = 0;
    	for (int i = 1; i <= 2024; ++i)
    	{
    		if (check(i))
    			++ans;
    	}
    	cout << ans << '\n';
    }
    

    python参考代码:

    
    
    ans = 0
    for i in range(1, 2025):
        i = str(i)
        if "12" in i:
            ans += 1
    print(ans)
    
    

    事实上C++也可以用类似python的方法,具体步骤就是,对于每一个数字:

    1. 先转化为字符串,方法就是先创建空字符串string k = "",再用取余10取出每一位数字,然后将这个数字异或48得到对应的数字字符的ASCII码,然后拼接到,注意我们是从尾到头取数字,要保持原来的顺序,我们就得每次都把字符拼接到字符串的头部而不是尾部,也就是说k = ch + k,而不是k = k + ch。
    2. 用find函数查找子串“12”是否在里面。

    可以通过这种方法熟悉C++字符和数字的转换和字符串操作。

    下面也给出该方法的C++核心参考代码:

    string to_str(int x)
    {
       string k = "";
       while (x)
       {
           k = char((x % 10) ^ 48) + k;
           x /= 10;
       }
       return k
     }
    
    inline void solve()
    {
        int ans = 0;
        for (int i = 1; i <= 2024; ++i)
        {
            if (to_str(i).find("12") ^ string::npos)
                ++ans;
        }
        cout << ans << '\n';
    }
    

    答案为140

    Information

    ID
    15241
    Time
    60000ms
    Memory
    256MiB
    Difficulty
    2
    Tags
    # Submissions
    116
    Accepted
    26
    Uploaded By