码迷,mamicode.com
首页 > 编程语言 > 详细

C++ U型数

时间:2020-04-11 23:29:03      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:iostream   分析   cst   叠加   提示   nan   return   现在   思路   

U型数字

最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增。比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 3131331313,就是不是U型数字。

现在蒜头君问你,[1,100000]有多少U型数字?

提示:请不要输出多余的符号。

题目来源

2018 蓝桥杯省赛 A 组模拟赛(一)

思路:

这道题刚开始看起来是一个从11e5的循环的题,但是仔细分析之后发现这道题的规律性很强,根本不用循环1e5那么多。

这个题先是把12位数去掉,因为这样的数是不可能满足的,所以就从能想到的最小的U型数101开始循环。

接下来就是先算三位数U型数的个数。

当我算完三位数的个数之后,发现在千位数加上一个大于百位数的数之后或是在个位数后加上一个大于个位数的数就是一个四位的U型数了,这样就可以在三位数的基础上求出四位数的个数了。

之后同样的思路,求五位数:可以是在三位数的百位数的前面加上一个数之后在个位后加上一个数,之后前后能添加的两个数的个数相乘便可以了;但是五位数还是可以在三位数的前面加上两个数或是在三位数的后面加上两个数便可,之后我先考虑放在前面的情况,也就是选两个数放在前面,条件便是第五数大于四位数大于第三位数,所以写个函数(叠加函数)便可了。之后看代码就可了。

代码:

 

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int func(int n)//叠加函数
{
    int m = 0;
    if (n <= 0) return 0;
    for (int i = 1;i <= n;++i)
    {
        m += i;
    }
    return m;
}
int main()
{
    int num = 0;
    for (int i = 101;i < 1000;++i)
    {
        int a = i / 100, b = i % 10;//a是百位,b是个位
        int j = (i-a*100)/10;//j是十位数
        if (a > j&& b > j)
        {
            num +=+ 1 +    //3位数
                (9 - a) + (9 - b) +//4位数    
                (9 - a) * (9 - b) + func(8 - a) + func(8 - b);//5位数
        }
    }
    cout << num << endl;
}

 

C++ U型数

标签:iostream   分析   cst   叠加   提示   nan   return   现在   思路   

原文地址:https://www.cnblogs.com/liushipeng648/p/12683036.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!