进制转换计算幸运数出现次数(华为od机考题)

一、题目

1.原题

有位客人来自异国,在该国使用m进制计数。
该客人有个幸运数字n(n<m),每次购物时,
其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。
问:当其购买一个在我国价值k的产品时,其中包含多少幸运数字?

2.题目理解

[位运算, 进制转换]

二、思路与代码过程

1.思路

把k转换成m进制的字符串,再去和n比较次数。

2.代码过程

①main函数

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入进制数m:");
        int m = sc.nextInt();
        System.out.println("请输入幸运数字n(n<m)");
        int n = sc.nextInt();
        System.out.println("请输入购买物品价值k:");
        int k = sc.nextInt();
        int count = LuckNumCount(m,n,k);
        String hm = ToM( k, m);
        System.out.println("这次购物的价格"+k+",转换之后为:"+hm+",包含了"+count+"个幸运数字"+n+"。");
    }

②LuckNumCount

private static int LuckNumCount(int m, int n, int k) {
        String TenToMK = ToM(k,m);//转换
        return countOc(TenToMK,n);//计数
    }

③ToM

private static String ToM(int k, int m) {
        StringBuilder ToMExpression = new StringBuilder();
        while (k > 0) {
            int remainder = k % m;
            ToMExpression.insert(0, remainder); // 插入到字符串的开头
            k /= m;
        }
        return ToMExpression.toString();
    }

④countOc

private static int countOc(String tenToMK, int n) {
        String luckNum = Integer.toString(n);
        int count = 0;
        for (char ch : tenToMK.toCharArray()){
            if (ch == luckNum.charAt(0)){
                count++;
            }
        }
        return count;
    }

三、运行结果

1.运行截图

2.带数据分析运行结果

请输入进制数m:
6
请输入幸运数字n(n<m)
3
请输入购买物品价值k:
1997

k0:1997
remainder:5
ToMexpression:5
k1:332

k0:332
remainder:2
ToMexpression:25
k1:55

k0:55
remainder:1
ToMexpression:125
k1:9

k0:9
remainder:3
ToMexpression:3125
k1:1

k0:1
remainder:1
ToMexpression:13125
k1:0

这次购物的价格1997,转换之后为:13125,包含了1个幸运数字3。

3.带数据分析完整代码

import java.util.Scanner;

public class test36 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入进制数m:");
        int m = sc.nextInt();
        System.out.println("请输入幸运数字n(n<m)");
        int n = sc.nextInt();
        System.out.println("请输入购买物品价值k:");
        int k = sc.nextInt();
        //int m = 6;
        //int n = 3;
        //int k = 1997;
        int count = LuckNumCount(m,n,k);
        String hm = ToM( k, m);
        System.out.println("这次购物的价格"+k+",转换之后为:"+hm+",包含了"+count+"个幸运数字"+n+"。");

    }

    private static int LuckNumCount(int m, int n, int k) {
        String TenToMK = ToM(k,m);//转换
        return countOc(TenToMK,n);//计数
    }

    private static String ToM(int k, int m) {
        StringBuilder ToMExpression = new StringBuilder();
        while (k > 0) {
            System.out.println("k0:"+k);
            int remainder = k % m;
            System.out.println("remainder:"+remainder);
            ToMExpression.insert(0, remainder); // 插入到字符串的开头
            System.out.println("ToMexpression:"+ToMExpression);
            k /= m;
            System.out.println("k1:"+k);
            System.out.println();
        }
        return ToMExpression.toString();
    }

    private static int countOc(String tenToMK, int n) {
        String luckNum = Integer.toString(n);
        int count = 0;
        for (char ch : tenToMK.toCharArray()){
            if (ch == luckNum.charAt(0)){
                count++;
            }
        }
        return count;
    }
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值