首页 > 试题广场 >

小红的数字串

[编程题]小红的数字串
  • 热度指数:1299 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小红拿到了一个数字串(由'1'~'9'组成,不含'0'),她准备截取一段连续子串,使得该子串表示的正整数小于k。你能帮她求出有多少种截取方案吗?

输入描述:
第一行输入一个数字串,长度不超过200000。
第二行输入一个正整数k
1\leq k \leq 10^9


输出描述:
小于k的截取方案数。
示例1

输入

1234
23

输出

5

说明

共有1,2,3,4,12这五种截取方法。
def main():
    import sys
    input = sys.stdin.read
    data = input().split()
    
    s = data[0]
    k = int(data[1])

    count = 0
    n = len(s)

    for i in range(n):
        if s[i] == '0':
            continue  # 跳过以 0 开头的子串
        
        num = 0
        for j in range(i, n):
            num = num * 10 + int(s[j])
            if num >= k:
                break
            count += 1

    print(count)

if __name__ == "__main__":
    main()

发表于 2025-06-12 17:24:23 回复(0)
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    long long k;
    cin >> s >> k;

    int n = s.size();
    int count = 0;

    for (int i = 0; i < n; ++i) {
        long long num = 0;
        for (int j = i; j < n; ++j) {
            //num = num * 10 + (s[j] - '0');
            string sub = s.substr(i,j-i+1);
            long long num =stoll(sub);
            if (num < k) {
                ++count;
            } else {
                break; 
            }
        }
    }

    cout << count << endl;
    return 0;
}

发表于 2025-06-24 11:53:57 回复(1)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 数字串
        String str = in.next();
        // k字符串
        String kStr = in.next();
        // 数字串的长度
        int length = str.length();
        // k的长度
        int kLength = kStr.length();
        // 得到正整数K
        long k = Long.parseLong(kStr);
        // 方法数
        int count = 0;
        // 遍历数字串
        for (int i = 0; i < length; i++) {
            long sum = 0;
            for (int j = i; j < length; j++) {
                // 将当前子串所表示的数值sum乘以10,再加上当前字符对应的数字
                // str.charAt(j)  - '0' 是将字符转换为对应的数字,例如字符 '1' 转换为数字 1
                sum = sum * 10 + (str.charAt(j) - '0');
                // 判断当前子串所表示的数值sum是否小于k,并且子串的长度(j - i + 1)是否小于等于k的长度 
                if (sum < k && (j - i + 1) <= kLength) {
                    count++;
                } else {
                    break;
                }
            }
        }
        System.out.println(count);
    }
}

发表于 2025-06-19 19:58:22 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        long count=0;
        String str = in.next();
        long k = in.nextLong();
        int n = str.length();
        int m=String.valueOf(k).length();

        for(int i=0; i<n; i++){

            long charSum=0;
            // charSum = str.charAt(i)-'0';
            for(int j=i; j<n; j++){
                charSum = charSum*10+(str.charAt(j)-'0');
                if((charSum<k) && ((j-i+1)<=m)){
                    count++;
                }else{break;}
            }
        }
        System.out.println(count);
    }
}
发表于 2025-06-18 20:24:47 回复(0)
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    long long k;
    cin >> s >> k;

    long long result = 0;
    long long sLen = s.size();
    long long kLen = to_string(k).size();

    if(sLen < kLen)
    {
        result = (sLen + 1) * sLen / 2;
        cout << result << endl;
    }
    else
    {
        long long temp1 = 0;
        for(int i = 0; i < kLen - 1; i++)
        {
            temp1 += (sLen - i);
        }
        long long temp2 = 0;
        for(int i = 0; i < (sLen + 1 - kLen); i++)
        {
            string tmpStr = s.substr(i, kLen);
            long long  num = stoll(tmpStr);
            if(num < k)
            {
                temp2++;
            }
        }
        result = temp1 + temp2;
        cout << result << endl;
    }
}
发表于 2025-06-14 15:07:53 回复(0)
#include <bits/stdc++.h>
#include <string>

using namespace std;

int main() {
    string in;
    string k;
    cin >> in >> k;

    long long count = 0;
   
    int numK=stoi(k);
    for (size_t i = 0; i < in.size(); i++) {
        long long num = 0;
        for (size_t j = i; j < in.size(); j++) {
            num = num * 10 + stoi(in.substr(j,1));
            if (num >= numK) {
                break;
            }
            count++;
        }
    }

    cout << count << endl;
    return 0;
}
发表于 2025-06-14 12:26:15 回复(2)
charlist = input()
k = input().strip()
result = 0
for i in range(len(k)):
    for start in range(len(charlist) - i):
        end = start + i
        if i == 0:
            value = int(charlist[start])
        else:
            value = int(charlist[start:end+1])
        if value < int(k):
            result += 1

print(result)

发表于 2025-06-13 15:56:27 回复(0)
private static int nums(String str, long k) {
        String kStr = k + "";
        int left =0;
        int cnt = 0;
        for(int right = 0;right <  str.length();right++){
            while(left <= right && comp(str,left, right, kStr) >= 0 ){
                left++;
            }
            cnt = cnt + right - left + 1;
        }
        return cnt;
    }

    private static int comp(String str, int left, int right, String kStr) {
        int len = right - left + 1;
        if (len > kStr.length()) {
            return 1;
        }
        if(len < kStr.length())
            return -1;
        for (int i = 0; i < len; i++) {
            int leftNum = str.charAt(left + i) - '0';
            int rightNum = kStr.charAt(i) - '0';
            if (leftNum > rightNum) {
                return 1;
            } else if (leftNum < rightNum) {
                return -1;
            }
        }
        return 0;
    }

编辑于 2025-06-09 16:55:23 回复(0)
#include <iostream>
using namespace std;

int main() {
    string str,k;
    cin>>str>>k;
    int lenN=str.size(),lenK=k.size();
    //cout<<stoi(str)-1<<endl;
    //if(lenN<lenK){
    //    cout<<0<<endl;
    //    return 0;
    //}
    int ans=0;
    if(lenN<lenK){//如果是数字串长度小于k的长度,则数字串的所有切割方案都小于正整数k,求数字串的所有切割方案即可返回
        for(int i=1;i<=lenN;i++){
            ans+=lenN-i+1;
        }
        cout<<ans<<endl;
        return 0;
    }
    //if(lenK<lenN){
        for(int i=1;i<lenK;i++){
            ans+=lenN-i+1;
        }
    //}
    //cout<<ans<<endl;
    long long numK=stoi(k);
    for(int i=0;i<lenN-lenK;i++){
        long long tempNum=stoi(str.substr(i,lenK));
        if(tempNum<numK){
            ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}
// 64 位输出请用 printf("%lld")
发表于 2025-06-07 10:08:09 回复(0)
def get_sub_minor(num_list, k):
    sub = []
    count = 0
    sub_length_max = k
    # 截取的子串的len肯定要小于等于k的len
    for ind in range(len(num_list)):
        for jnd in [ind + 1, ind + sub_length_max]:
            sub.append(num_list[ind:jnd])
    for element in sub:
        if int(element) < k:
            count += 1
    print(count)
# get_sub_minor(num_list='1234', k=23)

发表于 2024-10-14 14:54:33 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        int k = sc.nextInt();
        int left = 0;
        int right = 0;
        int res = 0;
        while (right < s.length()) {
            while (Long.parseLong(s.substring(left, right + 1)) >= k) {
                if (left == right) {
                    right++;
                }
                left++;
            }

            while (right < s.length() && Long.parseLong(s.substring(left, right + 1)) < k) {
                int curLength = right - left + 1;
                res += curLength;
                right++;
            }
        }
        System.out.println(res);
    }
}

发表于 2024-05-12 09:16:11 回复(0)