【二至九位数个位起符合递减限制求和】2022-11-19
缘由有限个整数 取限定条件的整数-编程语言-CSDN问答
void 暴力二至九位数个位起符合递减求和()
{//缘由https://ask.csdn.net/questions/7839942?spm=1005.2025.3001.5141int n = 0, nn = 0, r = 0, x = 0, h = 0, s = 0, ss = 0, m = 1;bool p = 1;std::cin >> n >> r; nn = n;
hc:if (r--){ s += nn * m, m *= 10, --nn; goto hc; }m /= 10;
ks:if (p)
{ss = s, x = ss % 10, ss /= 10;yz:if (ss){if (x > ss % 10); else ss = p = 0;x = ss % 10, ss /= 10;goto yz;}if (p&&s % 10 <= n)h += s, std::cout << s << "\t";else if (s>m)p = 1;elsegoto js;--s;goto ks;
}
js:std::cout << h << "\n";
}
void 高效二至九位数个位起符合递减求和()
{//缘由https://ask.csdn.net/questions/7839942?spm=1005.2025.3001.5141int a[9]{}, n = 0, nn = 0, r = 0, x = 0, h = 0, s = 0, ss = 0, m = 1;bool p = 1;//345 245 145 235 135 125 234 134 124 123std::cin >> n >> r;x = r, h = n;c:if (x--){ a[x] = h, --h; goto c; }x = r, m = 1;
hc:if (x--){ s += a[x] * m, m *= 10; goto hc; }r = m / 10;
//hc:if (r--){ s += nn * m, m *= 10, --nn; goto hc; }m /= 10;//顺序合成
//hc:if (r--){ s = s * 10 + n; --n; goto hc;}//逆序合成ks:if (p){ss = s, x = ss % 10, ss /= 10;yz:if (ss){if (x > ss % 10); else p = 0;x = ss % 10, ss /= 10;goto yz;}if (p&&s > r)h += s;else if (s>m)p = 1;elsegoto js;if (s / r > 1)s -= r;elser /= 10, s -= r, r *= 10, s += r;//待设计goto ks; }js:std::cout << h << "\n";}