找数字

本文介绍了一种解决数学问题的方法:给定一个奇数p(个位非5),找到整数S使得p*S等于一系列1组成的数字,并输出S及乘积的位数。提供了两种实现方式,一种利用BigInteger进行高效计算,另一种采用传统方法逐步逼近解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码:

import java.math.BigInteger;
import java.util.Scanner;

/*
 * 找数字
从键盘输入一个奇数p,其个位数字不是5,求一个整数S,使p*s=11....11。要求在屏幕上依次输出以下结果:
(1)S。
(2)乘积的数字位数。
样例输入:p=123

          S=903342366757
          15位
样例输入:127
样例输入:p=127

          S=874890638670166229221347331583552055993
          42位
 */
public class Main {
    public static final int MAX=100;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
//          String p = scanner.next();
//          findNum(p);
            int p=scanner.nextInt();
            findNum(p);
        }
    }
    /*
     * 使用bigInteger和StringBuilder进行处理
     */
    public static void findNum(String p){

        StringBuffer sBuffer=new StringBuffer();
        for(int i=0;i<=p.length();i++){
            sBuffer.append("1");
        }
        BigInteger divisor=new BigInteger(p);
        BigInteger bigInteger2=new BigInteger(sBuffer.toString());
        while(!bigInteger2.remainder(divisor).toString().equals("0")){
            sBuffer.append("1");
            bigInteger2=new BigInteger(sBuffer.toString());
        }
        System.out.println(bigInteger2.toString()+"\n"+bigInteger2.toString().length());


    }
    /*
     * 传统的方式做
     * 实践证明,字符串与数字的转化是很费时间的。
     */
    public static void findNum(int p){
        int temp=1, k=1,j=0;  
        while(temp<p){  
            temp=temp*10+1;  
            k++;  
        }  

        do{  
            System.out.printf("%d",temp/p);  //不断地输出最左边,尾数的增加,不影响最左边的输出
            k++;  
            j=temp%p;  
            temp=j*10+1;  
        }while(j!=0);  

        System.out.printf("\n%d\n",k-1);  
    }
}
### 关于华为OD模式下的数字算法题 在华为OD机试中,涉及“数字”的算法题目通常会考察考生对于数组操作、字符串处理以及特定数据结构的应用能力。以下是基于已有资料整理的一类典型的“数字”问题描述: #### 题目描述 给定一个长度为 `n` 的整数数组 `nums` 和一个目标值 `target`,要求出数组中两个不同位置上的数字之和等于目标值的所有组合,并返回这些组合的索引对。如果不存在这样的组合,则返回空列表。 具体要求如下: 1. 数组可能包含重复元素。 2. 返回的结果应不包含重复的组合。 3. 如果存在多个满足条件的组合,需全部列出。 4. 时间复杂度尽可能低。 示例输入输出说明: - 输入:`nums = [2, 7, 11, 15], target = 9` - 输出:`[[0, 1]]` 解释:`nums[0] + nums[1] = 2 + 7 = 9`,因此返回其索引 `[0, 1]`[^1]。 --- #### 解决方案概述 此类问题可以通过哈希表来高效解决。核心思想是利用字典存储已经遍历过的数值及其对应的索引,在后续遍历时快速判断是否存在符合条件的目标差值。这种方法的时间复杂度可以达到 O(n),空间复杂度也为 O(n)。 ```python def two_sum(nums, target): result = [] seen = {} for i, num in enumerate(nums): complement = target - num if complement in seen: result.append([seen[complement], i]) seen[num] = i return result ``` 上述代码实现了两数之和的功能,能够有效应对大多数场景需求。 --- #### 可能的变化形式 除了基本的两数之和外,“数字”类型的题目还可能出现以下变种: 1. **三数之和**:扩展至三个数相加为目标值的情况。 2. **最接近目标值的子序列**:到任意数量的数字使其总和最接近目标值。 3. **无序数组中的最大/最小乘积**:从数组中选取若干个数字计算它们的最大或最小乘积。 这些问题均可以在基础版本的基础上进一步演化和发展[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值