首页 > 试题广场 >

小苯的计算式

[编程题]小苯的计算式
  • 热度指数:1334 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小苯有一个长度为 n 的字符串,其是一个两非负整数加法运算的式子,形如:A+B=C

现在小苯只记得这个式子的结果 C,以及式子的长度 n

请你帮小苯数一数,总共有多少个不同的符合条件的这种式子呢。
(注意:A, B, C 都是不含前导零的。)

输入描述:
输入包含一行两个正整数 n, C\ (5 \leq n \leq 20),\ (1 \leq C \leq 200000)。分别表示计算式的长度,以及计算式的结果值。


输出描述:
输出一行一个整数,表示不同的符合条件的计算式个数。
示例1

输入

5 2

输出

3

说明

长度为 5 的,运算结果为 2 的,只包含非负整数的不同运算式有:
0+2=2
1+1=2
2+0=2
这三个。

备注:
小苯认为两个计算式 s1, s2 不同:当且仅当 s1, s2 长度不相同,或两者长度相同均为 n 时,存在一个 i\ (1 \leq i \leq n),使得 s1_i \ne s2_i
直接暴力求解
#include <iostream>

int get_num_len(int num)
{
    int res = 1;

    while(num/10)
    {
        res += 1;
        num /= 10;
    }

    return res;
}

int main()
{
    int n = 0,c = 0;
    std::cin>>n>>c;

    int c_len = get_num_len(c);
    
    int ans = 0;

    for(int i = 0;i <= c/2;++i)
    {
        int a = i,b = c-i;

        int a_len = get_num_len(a);
        int b_len = get_num_len(b);

        if(a_len + b_len == n - c_len - 2)
        {
            if(a != b)
            {
                ans += 2;
            }
            else
            {
                ans += 1;
            }
        }
    }

    std::cout<<ans;

}


发表于 2025-11-21 08:33:05 回复(0)
找了很久规律结果答案是用暴力解的我belike:
发表于 2025-11-21 10:29:31 回复(0)
//为了避免x为0漏算位数,直接to_string一下,返回s.length(),然后暴力即可
#include <iostream>
#include<algorithm>
#include<math.h>
#include<string>
using namespace std;

int check(int x)
{

string s=to_string(x);
return s.length();
}

int main()
{
    int len,c;
    cin>>len>>c;
   
    len-=2;
    len-=check(c);
   
    int sum=0;
    for(int i=0;i<=c;i++)
    {
      int b=c-i;
      if(check(i)+check(b)==len) sum++;

    }
  cout<<sum;

   

    return 0;
    }

发表于 2025-11-21 17:28:15 回复(0)

新手向暴力解法,注意 0 的位数也是 1 哦,所以用 do while 循环。

#include <iostream>

using namespace std;

int calc(int x) {
    int ret = 0;
    do {
        ret++;
        x /= 10;
    } while(x);
    return ret;
}

int main() {
    int n, c; cin >> n >> c;
    int ans = 0, t = calc(c);
    for(int i = 0; i <= c; i++) {
        //cerr << calc(i) << " " << calc(c - i) << " " << t << endl;
        if(calc(i) + calc(c - i) + t == n - 2) ans++;
    }
    cout << ans << endl;
    return 0;
}
发表于 2025-11-21 16:53:25 回复(0)
暴力求解太没意思了,这里分享一个纯数学求解的思路(已通关):
首先考虑加法交换律,我们假设a>=b,那么a的最小值就是c的一半。
然后我们就只需要考虑无进位(c的长度和a相等)的情况和有进位(c的长度比a多1位)的情况。
既然a和c的长度确定了,b的长度也就确定了。
由于b越大a越小,b越小a越大。我们直接计算边界值就能得到合法算式的数量。
将无进位情况和有进位情况的合法算式数量相加,然后乘2(加法交换律)
假如a+a=c是合法算式,就还要减1
就得到结果了。
发表于 2025-11-21 13:29:45 回复(1)