大整数截取解决方法(java代码)


解题思路来自这个博客:@简单^不简单
https://blog.csdn.net/younger_china/article/details/126376374

描述

花花有一个很珍贵的数字串,但是它太长了,没有办法保留下来,所以她想截取其中一段保存下来,但是她希望截取下来的这一段数对1000000007取模之后等于Ai,她想知道有多少种截取方案。数字串S中截取一段是指S[L], S[L+1], …, S[R]连起来所形成的十进制数,其中L和R满足1≤L≤R≤|S|。例如S=“1023456789”,S(1,2)=10,S(2,4)=23,S(2,10)=23456789。

输入描述

第一行一个数字串,长度不超过30000。

第二行一个数T,表示询问的数量。(T≤100)

接下来T行,每行一个非负整数Ai,表示询问有多少种截取方案使得其值模1000000007后等于Ai。(0≤Ai<1000000007)

输出描述

共T行,每行一个非负整数,表示方案数。

输入示例

1000000008001
4
8
0
1
10

输出示例

9
39
5
2

前置知识:

1.(a + b)%c =((a%c)+(b%c))%c
2. (a * b)%c =((a%c)*(b%c))%c
3.(a – b)%c =((a%c)–(b%c))%c

代码

import java.util.Scanner;
public class Main {
    static int tempMod = 1000000007;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String bd = in.nextLine();
        int n = in.nextInt();
        int[] nums = new int[n];
        for(int i = 0; i < n; i++) {
            nums[i] = in.nextInt();
        }
        for(int i = 0; i < n; i++) {
            System.out.println(find(bd,nums[i]));
        }
    }
    public static int find(String bd, int remainder) {
        int count = 0;
        for(int i = 0; i<=bd.length()-1;i++) {
        //第一层for循环表示从第i个值开始
            long remin = bd.charAt(i) - '0';
            //这里if语句判断表示只取一个值,做判断
            if(remin == remainder) {
                count++;
                if(i > 0){
                //这里的for循环表示当i左边还有数的时候,判断是否有0,有连续的n个0,就count自增n次,一定要连续,否则退出
                    for(int k = i-1; k >= 0;k--) {
                        if(bd.charAt(k) == '0') count++;
                        else break;
                    }
                }
            }
            if(remin != 0){
            //这里的for循环属于第二层for循环,作为判断截取数以坐标i开头,坐标j结尾的非个位数是否符合要求
            //注意,这里第二层判断的时候,开头的数坐标i不能等于0,不然没有意义,所以做了if判断
                for(int j = i+1;j <bd.length();j++) {
                    remin = ((remin * 10) % tempMod + (bd.charAt(j)-'0')) % tempMod;
                    if(remin == remainder){
                        count++;
                        if(i > 0){
                        //同样,当该数符合要求的时候,前面若还有数,判断是否有0,有连续的n个0,就count自增n次,一定要连续,否则退出
                            for(int k = i-1; k >= 0;k--) {
                                if(bd.charAt(k) == '0') count++;
                                else break;
                            }
                        }
                    }
                }
            }

        }
        return count;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下代码截取时间戳的后四位: ``` long timestamp = System.currentTimeMillis(); String lastFourDigits = String.format("%04d", timestamp % 10000); ``` 第一行获取当前的时间戳,第二行使用格式化字符串将时间戳对10000取余之后得到的结果转换为4位数字,并使用前导零补足4位。 例如,如果当前时间戳为1639407543000,则截取的后四位为7543。 ### 回答2: 在Java中,可以用以下代码截取时间戳的后四位: ```java import java.text.SimpleDateFormat; import java.util.Date; public class TimestampSubstring { public static void main(String[] args) { long timestamp = System.currentTimeMillis(); // 获取当前时间戳 String timestampStr = String.valueOf(timestamp); // 将时间戳转化为字符串 // 截取后四位 String lastFourDigits = timestampStr.substring(timestampStr.length() - 4); System.out.println("时间戳的后四位为:" + lastFourDigits); } } ``` 这段代码首先使用`System.currentTimeMillis()`方法获取当前时间戳,然后将时间戳转化为字符串。接下来,使用`substring()`方法截取字符串的后四位。最后,打印出截取后的结果。 例如,如果当前时间戳为1624578264797,则截取后的结果为4797。 ### 回答3: 要截取Java中时间戳的后四位,可以采用以下方法: 1. 将时间戳转换为字符串类型。 2. 检查字符串的长度是否大于等于四位,如果是,则截取最后四位作为结果;如果不是,则返回整个字符串作为结果。 下面是一个示例代码: ```java public class Main { public static void main(String[] args) { long timestamp = System.currentTimeMillis(); String timestampStr = String.valueOf(timestamp); String lastFourDigits; if (timestampStr.length() >= 4) { lastFourDigits = timestampStr.substring(timestampStr.length() - 4); } else { lastFourDigits = timestampStr; } System.out.println("截取的后四位:" + lastFourDigits); } } ``` 该代码首先获取当前时间的时间戳,然后将时间戳转换为字符串类型。接着检查字符串的长度,如果大于等于四位,则使用`substring()`方法截取最后四位作为结果,否则返回整个字符串作为结果。最后将结果输出到控制台。 注意:上述代码假设时间戳是一个非负整数,并且转换为字符串后不会以0开头。如果遇到不同的情况,需要根据实际需求进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值