面试题记1

2023-11-09

希望各位看客们能积极提供答案

1)125874和它的两倍251748,包含着同样的数字,只是顺序不同。找出最小的正整数x,使得2x,3x,4x,5x,和6x都包含有相同的数字。

2)求100!各位数之和

3)是用从1到9所有数字,将其任意的连接起来,使之组成十进制数,会得到不同的集合。{2,5,47,89,631}就是比较有趣的集合,它的所有数都属于质数,请问满足1-9都是用且只是用一次,而所有数都是质数的集合有多少个?

4)求满足x+y,x-y,x+z,x-z,y+z,y-z都是完全平方数,且x>y>z>0的最小x+y+z

5)perter有九个4面(金字塔形)骰子每个分别标1,2,3,4,colin有六个六面骰子,每个分别标1,2,3,4,5,6,perter和colin摇骰子,然后比较他们得到的总和,总和最高的获胜,如果相等的话则是平局。请问perter赢colin的概率是多少,结果以7位小数0.abcdefg的形式给出。


解答(面试的时候都没想出来,目前就想出一个来,以后慢慢补充答案吧,感觉这些题是给学数学的人做的,鄙人数学一直很烂,所以没办法,唉。)

2)其实这个考的是大数的乘法,100!这个数在任何语言里都无法找到可以容纳它的类型,所以只能自己定义结构来做了,(其实面试的时候也想到了解法,但是感觉不够好结果没写,后来也没想到更好的,悲催,而且感觉自己写代码的能力还不够强,在60分钟的时间里很难将代码调试通过,后来就放弃了。事实后面证明完成这个代码还是花了一个上午的时间的。写代码能力有待加强啊。奋斗

其实这里用到的主要思想在大学的课程里是有的,就是计算机组成原理里的串行进位链,这里只要用数组(或者其他结构,比如链表,队列都可以,我用java实现的,但是为了能更简单的转化为C的代码,这里就采用了数组来实现)保存计算的中间结果的各个位,数组下标从小到大对应保存中间结果的从低到高位来保存,计算方法用例子来说明吧:

比如a=123456789,b=123456789123456789,那么用数组A={1,2,3,4,5,6,7,8,9.-1-1.....}保存a,B={1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,-1,-1.-1.....}保存b(这里后面的数最好初始化为一个特殊值,我用的-1,这个特殊值是为运算时预设的循环停止条件,后面代码里可以看到。)那么做第一次乘法运算的时候就用A[0]乘以B的每个元素,期间要注意保存进位的值。这样就可以得到一个中间结果用res数组保存,我们另外再申请一个足够大的数组result用来保存最后的结果,第一次运算的时候将中间结果res拷贝到result保存,再将res清空,留待下次使用。第二次乘法的时候也就是A[1] * B我们又可以得到一个中间结果同样存放在res中,然后我们要做的就是上一次的中间结果和这一次的中间结果的加法运算,但是做加法之前我们要对第二次中间结果做一个移位操作,因为第二次的A[1]是相当于实际运算中的十位位置上的数,所以要将中间结果乘以10然后再做加法运算,加法运算得到的中间结果同样保存在result中留给下一轮加法运算,然后同样要清空res留作下轮乘法运算保存中间结果时使用,第三轮就是百位上的乘法了,也就是A[2] * B,得到的结果同样要做移位,只是移位的位数由上次的移动一位变成了两位,因为这是百位上的乘法,也就是10的平方,所以要移动两位,后面的格轮运算与之前的分析一样。这里要注意的是要自己先估算好做运算的两个数的大概大小,这样方便你预设运算中用到的数组的大小。这种方法可以计算任意大小的两个整数的乘法运算,只要你机器的内存够用就行。

下面是详细的实现代码:

public class Mytest
{
    public static void main(String[] args)
    {
        int i = 0;
        int [] result = test();
        Stack<Integer> s = new Stack<Integer>();
        while(result[i] != -1)
        {
            s.push(result[i++]);
        }
        System.out.println(s.size());
        while(!s.empty())
        {
            System.out.print(s.pop());
        }
    }
    private static int [] test()
    {
        int [] result = new int [200];
        result[0] = 1;
        for(int i = 1; i < 200; i++)
        {
            result[i] = -1;
        }
        for(int i = 1;i <= 100; i++)
        {
            result = bigNumberMutiply(result,numToArray(i));
        }
        int i = 0;
        int sum = 0;
        while(result[i] != -1)
        {
            sum += result[i++];
        }
        System.out.println(sum);
        return result;
    }
    private static int [] bigNumberMutiply(int [] a,int [] b)
    {
        int i = 0, j = 0;
        int carryValue = 0;
        int [] result  = new int [200];
        int [] tempRes  = new int [200];
        
        for(int n = 1; n < 200; n++)
        {
            result[n] = -1;
            tempRes[n] = -1;
        }
        while(b[j] != -1)
        {
            while(a[i] != -1)
            {
                int temp = b[j] * a[i] + carryValue;
                result[i] = temp % 10;
                carryValue = temp / 10;
                i++;
                if(carryValue != 0 && a[i] == -1)
                {
                    result[i] = carryValue;
                    break;
                }
            }
            i = 0;
            carryValue = 0;
            if(j == 0)
            {
                int n = 0;
                while(result[n] != -1)
                {
                    tempRes[n] = result[n];
                    n++;
                }
            }
            else
            {
                result = leftShiftNum(result,j);
                tempRes = add(result, tempRes);
            }
            resetArray(result);
            j++;
        }
        return tempRes;
    }
    private static int [] resetArray(int [] a)
    {
        for(int i = 0; i < a.length; i++)
        {
            a[i] = -1;
        }
        return a;
    }
//将数组保存的中间结果左移n位,相当于将这个大数乘以10的n次方
    private static int [] leftShiftNum(int [] a,int n)
    {
        if(n == 0)
            return a;
        int i = 0;
        while(a[i] != -1)
        {
            i++;
        }
        while(i >= 0)
        {
            a[i+n] = a[i];
            i--;
        }
        for(i = 0; i < n; i++)
        {
            a[i] = 0;
        }
        return a;
    }
//将一个整形的数转换成数组保存
    private static int [] numToArray(int n)
    {
        int [] a = new int[100];//数组的大小取决于n的大小,这里设置的这个值可以容纳一般的需要
        for(int i = 1; i < a.length; i++)
        {
            a[i] = -1;
        }
        int i = 0;
        while(n != 0)
        {
            a[i++] = n % 10;
            n = n / 10;
        }
        return a;
    }
//以串行进位链的方式模拟两个大数的相加
    private static int [] add(int [] a,int [] b)
    {
        int i = 0;
        int [] c = new int[a.length];
        int carryValue = 0;//用于保存计算过程中的进位值,如9+9=18,需要进位,进位值为1
        resetArray(c);//用于保存最后加法结果的数组
        while(a[i] != -1 && b[i] != -1)//如果还没运算到任何一个数的最高位则继续下一位的加法运算
        {
            
            int temp = a[i] + b[i] + carryValue;
            if(temp < 10)
            {
                c[i] = temp;
                carryValue = 0;
            }
            else
            {
                c[i] = temp % 10;
                carryValue = temp/10;
            }
            i++;
        }
        if(a[i] == -1)//如果运算时a的最高位先到,比如a=12,b=1234,则上述循环后还需单独处理b千位和百位 (1)
        {//如果b的高位还有值未处理,或者a的最高位运算后有进位值(可以尝试一下a=1,b=9999这种特殊情况就会明白了)
            while(b[i] != -1 || carryValue != 0)
            {
                if(b[i] == -1)
                {
                    c[i] = carryValue;
                    carryValue = 0;
                }
                else
                {
                    int temp = b[i] + carryValue;
                    if(temp < 10)
                    {
                        c[i] = temp;
                        carryValue = 0;
                    }
                    else
                    {
                        c[i] = temp%10;
                        carryValue = temp/10;
                    }
                }
                i++;
            }
        }
        if(b[i] == -1)//同(1)
        {
            while(a[i] != -1 || carryValue != 0)
            {
                if(a[i] == -1)
                {
                    c[i] = carryValue;
                    carryValue = 0;
                }
                else
                {
                    int temp = a[i] + carryValue;
                    if(temp < 10)
                    {
                        c[i] = temp;
                        carryValue = 0;
                    }
                    else
                    {
                        c[i] = temp%10;
                        carryValue = temp/10;
                    }
                }
                i++;
            }
        }
        return c;
    }
}

这个题的最后结果是:100!长度为158位,

值为:

93326215443944152681699238856266700490715968264381621468592963895217599

993229915608941463976156518286253697920827223758251185210916864000000

000000000000000000,

各位数之和为:648

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试题记1 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 热重载在docker中运行的java程序

    我开发了一个java程序 应该在docker中运行 然而 我在调试docker中运行的java程序时遇到了很多痛苦 我在网上搜索 一些教程提出了像 spring dev tools 这样的工具 因为我的java程序是基于spring boo
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • 供应链金融与区块链01——论文阅读

    本文章仅用于记录本人学习过程 当作笔记来用 如有侵权请及时告知 谢谢 1 基于区块链技术的供应链金融体系优化研究 龙云安 但是由于 互联网 供应链 无法 及时跟进资金流和信息流 导致核心企业 供应链金 融平台和提供融资的商业银行无法及时掌控
  • 解决前端跨域的问题.Access to XMLHttpRequest at http://xxx.xxx from origin 'http://localhost:8000' has been bl

    1 前端浏览器报错如下 Access to XMLHttpRequest at http xxx xxx from origin http localhost 8000 has been blocked by CORS policy Res
  • Scratch 3.0源码 之 多语言实现

    文章目录 实现方式 初始版本 多语言版本 1 页面文件 2 配置文件 3 建立关联 语法说明 案例1 带HTML标签写法 建议写法 案例2 带超链接写法 建议写法 Scratch 3 0中各类显示文本默认是英文 如果不支持自己的语言 或者自
  • 红队隧道应用篇之Neo-reGeorg实现内网穿透(四)

    简介 reGeorg是一个能够实现内网穿透的工具 基于socks5协议 且能支持众多脚本 由于此工具使用率过高 导致容易被杀毒软件拦截 现有一个项目是由reGeorg修改而来 而且做了加密和免杀处理 这款工具的名字就叫Neo reGeorg
  • sqlServer 自定义函数-传入参数并返回动态表

    自定义函数 传入参数并返回动态表 create FUNCTION dbo v usrlist usr varchar 20 传入当前用户代码 返回动态表 表里面包含编码及名称两个字段 RETURNS tolist TABLE usrcode
  • 一般面试时会遇到的九大难题的对策解析

    终于接到面试通知书了 欣喜之余开始考虑即将面对的种种问题 所谓有备无患 您是否尝试过面试彩排 建议您现在就不妨试上一试 我想这会帮助你对其他问题的回答做准备 好啦面试开始 想象着考官已经坐在您的面前 问题1 为什么不谈谈你自己 分析 这是个
  • 渲染函数render

    文章目录 节点 树以及虚拟 DOM 树 节点 虚拟 DOM vue中render函数的作用 render函数去创建子组件内容 createElement官方文档 参考 节点 树以及虚拟 DOM 在深入渲染函数之前 了解一些浏览器的工作原理是
  • 2016去哪儿编程题:5-血型遗传检测

    题目描述 血型遗传对照表如下 父母血型 子女会出现的血型 子女不会出现的血型 O与O O A B AB A与O A O B AB A与A A O B AB A与B A B AB O A与AB A B AB O B与O B O A AB B与
  • shell 数组(字符串下标)

    现在游戏开的服务器越来越多了 每次用ssh操作都要写ip地址 很烦 也容易出错 所以要自己搞个服务器名到ip的映射 map anahost count 0 temp cat home linwencai sh HOST while read
  • ubuntu18.04合并pdf文件

    以前使用pdftk比较常见 但是pdftk的更新似乎没有跟上 改用pdfunite轻松解决 pdftk原来使用apt安装 现在改成用snap安装pdftk sudo snap install pdftk pdftk合并命令为 pdftk p
  • 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here

    题目链接 https www luogu com cn problem P1200 include
  • C++函数基础

    一 函数的定义和使用 1 函数的定义 类型说明符 函数名 含类型说明的形参表 语句序列 如 int GetSum int a int b return a b 2 形式参数 形式参数的作用是实现主函数与被调函数之间的联系 3 函数的返回值和
  • 【ubuntu】ubuntu实体机与windows互传文件(两台电脑)

    先记录一些命令 dpkg list 查看软件列表 sudo apt get purge remove 包名 purge是可选项 写上这个属性是将软件及其配置文件一并删除 如不需要删除配置文件 可执行sudo apt get remove 包
  • Python列表操作中extend和append的区别

    1 用法 append 用于在列表末尾添加新的对象 输入参数为对象 extend 用于在列表末尾追加另一个序列中的多个值 输入对象为元素队列 2 相同点 两个都是对列表即list进行的操作 具体句法可以写为 list1 append obj
  • 解决EXPLORER应用程序错误,桌面出不来

    打开运行 输入CMD 输入for 1 in windir system32 dll do regsvr32 exe s 1 意思是注册所有DLL组件 一般都能解决问题 转载于 https blog 51cto com feifei888 4
  • word文件doc、docx转pdf

    综合类管理系统不管是自研还是外包项目都会被客户或者产品经理要求 实现word导出 excel导出 pdf导出等功能 其实pdf导出呢 有很多种方式 我实现过的就有两种 接下来呢 就说说其中的一种 就是当你已经实现了word导出 或有明确的要
  • 粉丝文化:抖音广告短视频美妆营销中,男明星比女明星更带货?

    1996年 木村拓哉为佳丽宝拍摄了一支口红广告 这条广告轰动一时 代言的口红两个月就卖出了300万支 从此 男明星就成了美妆品牌的宠儿 众多美妆品牌开始启用男明星代言人 男明星为何有如此强力的带货潜力 美妆品牌如何在短视频时代占得先机 抖音
  • 阿里天池比赛——街景字符编码识别

    文章目录 前言 一 街景字符编码识别 1 目标 2 数据集 3 指标 总结 前言 之前参加阿里天池比赛 好久了 一直没有时间整理 现在临近毕业 趁论文外审期间 赶紧把东西整理了 5月底学校就要让我们滚蛋了 哭哭哭 大运会的牺牲品 一 街景字
  • 赛马游戏的java设计_赛马游戏源码

    0 Intro pos g setClip 10 10 HorseMidlet imgIntro 0 getWidth HorseMidlet i mgIntro 0 getHeight g drawImage HorseMidlet im
  • 面试题记1

    希望各位看客们能积极提供答案 1 125874和它的两倍251748 包含着同样的数字 只是顺序不同 找出最小的正整数x 使得2x 3x 4x 5x 和6x都包含有相同的数字 2 求100 各位数之和 3 是用从1到9所有数字 将其任意的连