标签:iostream 分析 cst 叠加 提示 nan return 现在 思路
U型数字
最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增。比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 3131331313,就是不是U型数字。
现在蒜头君问你,[1,100000]有多少U型数字?
提示:请不要输出多余的符号。
思路:
这道题刚开始看起来是一个从1到1e5的循环的题,但是仔细分析之后发现这道题的规律性很强,根本不用循环1e5那么多。
这个题先是把1、2位数去掉,因为这样的数是不可能满足的,所以就从能想到的最小的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; }
标签:iostream 分析 cst 叠加 提示 nan return 现在 思路
原文地址:https://www.cnblogs.com/liushipeng648/p/12683036.html