【算法刷题日记之本手篇】最难的问题与因子个数

举报
未见花闻 发表于 2022/11/30 21:09:08 2022/11/30
【摘要】 ⭐️最难的问题⭐️ 🔐题目详情NowCoder生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是军团中的一名军官,需要把发送来的消息破译出来、并提供给你的将军。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A 都分别替换成字母F),其他字符不 变,并且消息原文的所有字母都是大写的。密码中的字母与原文...

⭐️最难的问题⭐️

🔐题目详情

NowCoder生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是军团中的一名军官,需要把发送来的消息破译出来、并提
供给你的将军。
消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A 都分别替换成字母F),其他字符不 变,并且消息原文的所有字母都是大写的。密码中的字母与原文中的字母对应关系如下。
密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U

输入描述:

输入包括多组数据,每组数据一行,为收到的密文。
密文仅有空格和大写字母组成。

输出描述:

对应每一组数据,输出解密后的明文。

示例1

输入

HELLO WORLD<br/>SNHJ

输出

CZGGJ RJMGY<br/>NICE

链接:最难的问题
来源:牛客网

💡解题思路

基本思路: 模拟题

解题思路:
题目的意思就是给你一个密码串,还原为原来的明文字符串,规则就是将大写字母的顺序向左移动五位,如A,变为VF变为A

那么有两种情况,如果字符出现在字母表的顺序在F之前,则字符的ASCII加上21,在F之后的字符串,则字符的ASCII码减去5

当然还可以使用哈希表将密码字符与明文字符一一对应起来,根据对应起来的关系,根据密码表的字符查询也可以等到原来的明文。

🔑源代码

// write your code here

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String pw = sc.nextLine();
            StringBuilder ans = new StringBuilder();
            int n = pw.length();
            for (int i = 0; i < n; i++) {
                char c = pw.charAt(i);
                if (c == ' ') ans.append(c);
                else if (c < 'F') ans.append((char) (c + 21));
                else ans.append((char) (c - 5));
            }
            System.out.println(ans);
        }
            
    }
}

🌱总结

本题为简单模拟题,将密码字符在循环的字母表中向左移动五位即可。

⭐️因子个数⭐️

🔐题目详情

一个正整数可以分解成一个或多个数组的积。例如36=223*3,即包含2和3两个因子。NowCoder最近在研究因子个数的分布规律,现在给出一系列正整数,他希望你开发一个程序输出每个正整数的因子个数。

输入描述:

输入包括多组数据。
每组数据仅有一个整数n (2≤n≤100000)

输出描述:

对应每个整数,输出其因子个数,每个结果占一行。

示例1

输入

30<br/>26<br/>20

输出

3<br/>2<br/>2

链接:因子个数
来源:牛客网

💡解题思路

基本思路: 数学模拟
解题思路:
题目给我们一个数字n,需要我们求构成这个数的素数因子,那么最大的因子肯定不会超过n的平方根,其实这道题很直接,我们可以从小到大枚举素数i,然后判断n是否能够被i整除,如果可以,说明该数为n的一个因子,并一直将n除以i直到不能够除尽为止并更新n的值,然后将i变为下一个素数,重复上述的判断。

但是其实不需要枚举出素数,其实从2开始枚举正整数即可,因为被一个较小的因子除到不能够再整除的时候,后面再除以该因子的倍数肯定也是不能够被整除的,比如一个数被2整除到的不能够再继续被整除了,那么它一定也不能够被2的倍数整除。

举一个实际的例子:36=2*2*3*3,被2整除到不能够被整除时,得到99是不能够被2到的倍数整除的。

所以我们只需从2开始枚举正整数,如果n能够被整除,因子数加一,并将n更新为不能再被当前枚举的数整除的那个值,并且更新后的n的因子一定也会小于等于更新后的n的开平方的值。

最后简单说一下,就是你可以理解一个数是由若干个素数乘积得来的,那么我们可以从小到大进行枚举,如果n能够被整除,则将n中所有的该因子都除尽,并将n更新为除尽后的数,然后枚举下一个数以此类推。

当然,如果n本身就是一个素数,最终n的值会大于1,所以最后还需要判断n是否为1,如果不为1因子还包括n本身,计数需要加1

🔑源代码

// write your code here

import java.util.*;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int ans = 0;
            for (int i = 2; i * i <= n; i++) {
                if (n % i == 0) ans++;
                while (n % i == 0) {
                    n /= i;
                }
            }
            if (n != 1) {
                ans++;
            }
            System.out.println(ans);
        }
    }
}

🌱总结

本题为因数分解题,属于数学问题。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。