精华内容
下载资源
问答
  • 1到100共100个数, 1开始, 每隔1, 2, 3, 4 ... 个数拿走一个数, 一直循环, 最后剩下? 就是说, 一开始把 1 拿走, 隔1个数(2), 把3拿走, 再隔2个数(4, 5), 把6拿走, 再隔3个数(7, 8, 9)把10拿走. 数到100之后再...
  • 有10个队员围成一圈,顺序排号,第一开始报(1到3), 凡报到3的人退出圈子,编程实现最后留下的是原来第号队员?答案是4号队员

    在这里插入图片描述


    1.题目描述:

    有10个队员围成一圈,顺序排号,从第一个开始报数(从1到3报数), 凡报到3的人退出圈子,编程实现最后留下的是原来第几号队员?


    2.分析:

    在这里插入图片描述
    一定要好好审题,凡事报到3的人要退出圈子,博主一开始就是认为剩下两个就算完事了,但是两个也可以排除一个啊。

    我们看上图,10个人最后只剩下1个人,所以我们可以设置一个变量sum,每退出一个人,sum的值就加1,当sum的值等于9时,也就代表着只剩下最后一人。还有一个难点就是数组是单向的,无法像循环链表那样可以围成一个圈,这样一个题,使用循环链表,那不是看不起循环链表嘛,那么怎么不用链表从10返回从小开始报数呢?我们可以设置一个变量,当它是数组最后一个元素时,就让他成为第一个。


    3.代码

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    int main()
    {
    	int person[10] = {1,2,3,4,5,6,7,8,9,10};
    	//思路 能被3整除的设为0
    	int array[2];
    	int count = 0;
    	int sum = 0; //如果有一个人退圈 就加1 如果值为9则退出循环
    		for (int i = 0; i < 10; i++)
    		{
    			if (person[i] != 0)//跳过已经退出的人
    			{
    				count++;
    			}
    			//单靠count % 3 == 0 无法正确判断,因为0%3也是0
    			if (count % 3 == 0 && person[i] != 0) 
    			{
    				count = 0;
    				person[i] = 0;
    				sum++;
    			}
    			if (sum == 9)//只剩下一个数,打印非0数
    			{
    				for (int j = 0; j < 10; j++)
    				{
    					if (person[j] != 0)
    						printf("%d ", person[j]);
    				}
    				return 0;
    			}
    			if (i == 9)//最后一个指向第一个
    			{
    				i = -1;
    			}
    		}
    	return 0;
    }
    

    上面针对的是10个人,然后剩下9人,如果是20人呢? 是不是应该是19,要懂得与一反三。就这样吧,拜拜了!明天见。

    展开全文
  • 最近找实习, 在做Test Assignment时遇到了这么道题, 就顺便记录... 具体的讲就是一开始(隔0个数)把 1 拿走, 隔1个数(2)把3拿走, 再隔2个数(4, 5)把6拿走, 再隔3个数(7, 8, 9)把10拿走. 第一圈数到100之后接着2开...

    最近找实习, 在做Test Assignment时遇到了这么道题, 就顺便记录下来:
    说, 有1到100共100个数, 摆成一个圈. 从1开始, 每隔1, 2, 3, 4 ... 个数拿走一个数, 一直循环, 最后剩下几? 具体的讲就是一开始(隔0个数)把 1 拿走, 隔1个数(2)把3拿走, 再隔2个数(4, 5)把6拿走, 再隔3个数(7, 8, 9)把10拿走. 第一圈数到100之后接着从2开始数, 直到最后剩下1个数为止, 请问最后剩下几? 如果是1到n呢?

     1     public static int selectNumber(int n) {
     2         
     3         int result = -1;
     4         ArrayList<Integer> nums = new ArrayList<Integer>();
     5         int index = 0;     // this variable is used to remove numbers from list 
     6         int count = 0;     // count is used to count which numbers should be remove
     7         int pIndex = 0;  // this is used to record previous index
     8         
     9         // generate a list contains numbers from 1 to n
    10         for(int i = 1; i <= n; i++) {
    11             nums.add(i);
    12         }
    13         
    14         while(nums.size() > 1) {
    15             
    16             while(index < nums.size()) {
    17                 nums.remove(index);     
    18                 count++;
    19                 pIndex = index;
    20                 index += count;
    21             }
    22             
    23             index = count - (nums.size() - pIndex);
    24             
    25             while(index > nums.size() - 1) {
    26                 index = index - nums.size();
    27             }
    28         }
    29         
    30         result = nums.get(0);
    31         return result;
    32     }
    33     
    34     public static void main(String[] args) {
    35         int surviver = selectNumber(100);
    36         System.out.println("The surviver is: " + surviver);
    37     }

    以上就是我的解决方案, 最后留下的数是31


    2016.06.04更新:

    在我发布这篇博文之后热心网友指出这叫"约瑟夫环". 于是我就去网上搜了一下, 并找到了一个比较简洁的约瑟夫环代码(这个代码不是我原创, 是在别人代码的基础上修改得来):

     1     /**
     2      * 约瑟夫环:
     3      * n个数字摆成一个环, 从1开始数, 数到m或m的倍数的数字被删除, 然后继续, 直到剩下1个数字为止
     4      */
     5     public static int josephProbBasic(int n, int m) {
     6         ArrayList<Integer> list = new ArrayList<>();
     7         for(int i = 1; i <= n; i++) {
     8             list.add(i);
     9         }
    10         // 用于计数
    11         int count = 1;
    12         // 当list中只剩下1个数时, 结束循环
    13         for(int i = 0; list.size() > 1; i++) {
    14             // 如果数到list的结尾, 从0开始重新数
    15             if(i == list.size()) {
    16                 i = 0;
    17             }
    18             // 在m的倍数时, 删除对应的数
    19             if(count % m == 0) {
    20                 // 由于删除之后, list中被删除元素之后的元素都会依次向前移动一位, 因此也要把i向前移动一位
    21                 list.remove(i--);
    22             }
    23             count++;
    24         }
    25         return list.get(0);
    26     }

    但是这只是普通的约瑟夫环, 而我的问题要更麻烦一点. 于是乎, 我根据上面的思路重写了这个问题的代码:

     1     /**
     2      * 升级版约瑟夫环:
     3      * n个数字摆成一个环, 从1开始数, 每隔m个数字删除一个数字. m的初始值为0, 然后m++, 就是0, 1, 2, 3....
     4      *  这样不断删除, 直到剩下1个数字为止.
     5      * @param n
     6      * @return
     7      */
     8     public static int josephProbV2(int n) {
     9         ArrayList<Integer> list = new ArrayList<>();
    10         for(int i = 1; i <= n; i++) {
    11             list.add(i);
    12         }
    13         int count = 0;
    14         int m = 0;
    15         for(int i = 0; list.size() > 1; i++) {
    16             if(i == list.size()) {
    17                 i = 0;
    18             }
    19             // 如果count数到m个数, 就删除对应的数字, 同时count从零开始重新数, m = m + 1
    20             if(count == m) {
    21                 list.remove(i--);
    22                 count = 0;
    23                 m++;
    24             }else {
    25                 count++;
    26             }
    27         }
    28         return list.get(0);
    29     }

    这样感觉清爽多了. 

     

    转载于:https://www.cnblogs.com/zhenyu-go/p/5529618.html

    展开全文
  • 第一个人开始报1到3), 凡报到3的人退出圈子,问最后留下的是原来第号的那位。 分析: 将每人编上坐标,并且给每人定下最开始的下标,等只剩下最后一人的时候,用他的坐标去找相应人的...

    有10个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),

    凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

     

    分析:

    将每个人编上坐标,并且给每个人定下最开始的下标,等只剩下最后一个人的时候,用他的坐标去找相应人的编号

    下标        0 1 2 3 4 5 6 7 8 9
    编号        1 2 3 4 5 6 7 8 9 10
    第一次  1   1 2 - 1 2 - 1 2 - 1
    第二次  2   2 -   1 2   - 1   2
    第三次  3   -     1 2     -   1
    第四次  4         2 -         1
    第五次  5         2           -
     

     

     

    
    public class CallNumber {
        public static void main(String[] args) {
    
            int value = callSurvivalNumber(1);
            System.out.println(value);
        }
    
        
        public static int callSurvivalNumber(int count) {
            if (count <= 0) {
                throw new IllegalArgumentException("Count must >0");
            }
            boolean[] status = new boolean[count];
            for (int i = 0; i < status.length; i++) {
                status[i] = true;
            }
            int index = -1;
            int counter = 0; //当前退出的人数 n-1
            int current = 0; //当前人报的数
            while (counter < status.length - 1) {
                //index 成环
                index = (index + 1) % status.length;//0
                if (!status[index]) {
                    continue;
                }
                //报数
                current = (current + 1) % 3;   //1
                //退出
                if (current == 0) {
                    counter++;
                    status[index] = false;
                }
            }
            for (int i = 0; i < status.length; i++) {
                if (status[i]) {
                    return i + 1;//1-n 0-(n-1)
                }
            }
            throw new RuntimeException("Not found");
        }
    }
    

     

    展开全文
  • 大家好我是波导终结者,这次跟大家分享一下10个实用的EXCEL技巧。跟那些烂大街的什么提取...1.统计不重复项以前在开发ERP的时候,曾经需求,就是庞大的数据中统计出SKU。当时研究了半天,最后用Hashtable...

    大家好我是波导终结者,这次跟大家分享一下10个实用的EXCEL技巧。跟那些烂大街的什么提取生日不一样,可能会比较复杂,所以我会附上详细的函数解释、说明和思路。

    使用环境以EXCEL2007默认安装为准。强烈建议大家抛弃2003,因为新格式比旧格式优秀太多,这个放到最后讲。

    1.统计不重复项数

    1ace4c5329acad88bc4834dd1a1d1405.gif

    以前在开发ERP的时候,曾经有一个需求,就是从庞大的数据中统计出SKU。当时研究了半天,最后用Hashtable然后取其个数实现了,这个属于编程范畴,就有点扯远了。

    那如果我们在EXCEL中需要这么做,用什么函数可以做到呢?毕竟工具所限,不太可能用哈希表。

    方法很简单:

    =SUMPRODUCT(1/COUNTIF(B2:B15,B2:B15))

    这个方法用到了两个函数,一个是大家很熟悉的COUNTIF,另一个是没怎么见过的SUMPRODUCT。

    先来讲SUMPRODUCT,这个函数拆开来看就是SUM和PRODUCT,即“把乘积求和”。

    它接受的参数,是N个数组(重要),每个参数数组的大小必须是一样的,然后这个函数就会把对应的项先相乘,最后相加。

    比如SUMPRODUCT(A1:A5,B1:B5),那么就会计算A1*B1,然后是A2*B2……一直到A5*B5,最后相加。

    而如果参数只有一个,那就没得乘,直接变成简单的数组内元素相加,我们利用的就是这一点。

    9b73837abf404e7e83c35ab0f86bf94c.png

    接下来再来看COUNTIF。COUNTIF一般的应用我们见过挺多,但是COUNTIF(B2:B15,B2:B15)这是个什么操作,条件竟然是个区域,而且与值域一样?

    对于这样的写法,COUNTIF会返回一个数组,里面存储着B2在B2:B15中的个数,B3在B2:B15中的个数……类推。

    这样一来,这个值在范围内出现过N次,它在数组里也就会返回N次值,值还是为N。比如B2的“波导一”,它出现过3次,并且也被数到3次。

    而1/COUNTIF(B2:B15,B2:B15)则会将1除以这个数组内的每个N,作为一个新的数组返回。这样,“波导一”出现3次,在数组里就会有3个1/3,“波导三”出现2次,就会有2个1/2……

    大家发现了吧,N个的1/N相加,结果肯定是1。然后1的个数有几个呢?四个。也即范围内不重复的项数。

    2.快捷生成大写数字

    有时候需要生成大写数字,如果自己一个一个敲还是很烦的,其实EXCEL有这么个函数:

    dce497692decfc7d5b5c1f19f983f4a4.png

    NUMBERSTRING这个函数简直是本地化的典范,中文专用,第2个参数可以取1、2、3,效果直接在图上演示了,就不凑字数了。

    不过这个函数也有缺点:不支持小数。

    8724c8c180f3c26dbe86870e09d77091.png

    如果有小数的话,函数会自动四舍五入取整,注意,会四舍五入。

    一般情况下,我们的小数只有两位,可以用上图方式分别取出来,然后转成大写的伍和陆,后面自己手动接X角X分。

    或者直接把小数部分弄成整数,然后中间自己加“点”,变成一二三四点五六。

    具体方法还有很多,看实际需求再具体改函数。

    写这点也是有感而发。一个是之前初入职场的时候手动写过这种函数,现在回头来看蠢死了。

    另一个就是提醒大家四舍五入一定要注意。以前我开发ERP的时候,就和公司里的财务扯过蛋。

    之前公司里的折扣都是2位数,后来扩展到3位数了,这时候问题出现:你要全程保持可见数值的精度,就得全程保留3位小数,这很好理解吧。

    举个最简单的例子:0.995+0.005=1.000,如果只保留两位小数会出现什么问题呢?1.00+0.10=1.00或者1.10。为什么会或者?一个是后台相加的实际值,一个是前台已经四舍五入过一次之后的值相加。如果前面已经四舍五入过了,精度损失,这两个数不可能兼得呀。

    而当时的财务却要求:不将2位精度改为3位精度,同时结果既满足后台实际值,又满足前台可见值,而且还只能有一个结果。这明显就不可能。说白了那个财务懒得一逼,啥也不想做罢了;而且也蠢得一逼,连EXCEL函数都不懂得改。

    3.查找某行或者某列的特定值

    VLOOKUP这个函数,很多人都有听过,但经常有人用不明白。

    f5163fdcf5914783be43a9986e45b8fa.png

    这函数说白了,从某个区域内找到某个数,但是使用上却有以下几个要点:

    1.VLOOKUP是竖着从参数2的范围内,找第一列值,如果想横着找,请用HLOOKUP。

    2.参数3返回对应的,另一列的值。这个数字是范围内的第几列,而不是整个表格的第几列。当然你可以试试设为1……另外,这个数必须为正数,不能反着找。你可以把目标列复制一列,放后头隐藏起来。

    3.参数4设为FALSE为精确匹配,TRUE为近似匹配。然而,近似匹配却有两个弱点,如上图▲

    05b424df88bdfcc6b21c64a558a067fa.png

    近似匹配时,第一列必须为升序排列,否则报错。数值的话好理解,字符串就会有些头痛。

    另外,近似匹配很容易得到无法预料的效果。不管是字符串还是数字,它取的都是“相近”的值,而这个相近很容易得到你不想要的结果。所以一概建议大家使用精确匹配。

    另外要注意,字符串前后有空格,或者查找数字但目标区域是字符串格式都会导致得到错误结果,一定要检查仔细。

    4.VLOOKUP的高级应用

    首先我们来看多重查找。比如现在东哥想找出所有不能拼命的员工,列成一个表,或者丁哥想把所有患重病的员工找出来,列成一个表。

    这个需求我们当然可以直接用现成的筛选或者过滤来做,但是这样有时候会破坏原表格。而且有的领导不太会用EXCEL,到时候乱搞一通,显示结果乱了,咱又得背锅。

    7985be6c18d6a3fe6b340667e9767810.png

    这里我们用添加辅助列的方式来做。辅助列也是学好EXCEL必备的方法,有点类似数学题里的辅助线。有的题不加,还能做,有的题不加还真的做不了。

    A列和H列分别为公式文本。

    首先看一下这个:(D2=$F$2)+B1。利用到了EXCEL里,TRUE为1,FALSE为0的特性。如果是男员工,则数字加1,如果不是,就一直保持之前的数字。而绝对引用和相对引用这些我真的不想再说一遍了。

    这样,我们在B列就生成了一个数组,每个目标行的数值都会比之前的大1。

    再来看:IFERROR(VLOOKUP(ROW(B1),B1:D$6,2,0),"无")。IFERROR只是为了防止、过滤报错结果,你可以填成空字符串,这样结果就直接可拷走。

    ROW(B1)返回1,ROW(B2)返回2,往下拉类推。而查找1,就是找到第一个目标员工。

    下拉之后,ROW(B2)返回2,B1:D$6变为B2:D$6,即从剩下的单元格中,查找第2个目标员工。以此类推。

    3c8e00ff6a78d7a3716589c10bceb46f.png

    第二个,通配符查找。刚才我提到过了,用近似匹配很难得到你想要的值,但是你想要模糊查找怎么办呢?

    很简单,VLOOKUP支持通配符,比如我在后面加个问号,查找的就是“波导1”后面再跟一个字符的数值。问号代表一个,星号代表任意,这些DOS时代过来的了,不再多讲。

    908412043fa3a34b4fe3c8a846c7ffb6.png

    最后再来分享一下反向查找。刚才提过,VLOOKUP不支持反向查找,前提是不用其他函数做辅助处理。

    这里我们用:VLOOKUP(C12,CHOOSE({2,1},C2:C6,D2:D6),2,FALSE)。核心要点在CHOOSE函数,说白了就是把第二列先返回,再返回第一列,则生成一个临时表,性别列排在名字列前面。

    然后我们就找出第一个女员工了。

    个人不推荐这么做,很容易乱,后面如果改个东西,函数就很麻烦,还是辅助列好用。

    VLOOKUP可以嵌套非常多函数,根据使用场景来实际操作比较直观,有需要的可以关注点赞,留个言。

    5.数据透视表

    5e779056908ff6cc844987526c03ccc6.png

    首先我们来看一下这张表。只是演示效果,所以就随便打了一些数据。

    之前开发ERP的时候,对于报表就有一个非常强烈的需求:数据透视表。源头就是EXCEL的这个功能。

    当然有人可能会问,为什么不让他们自己拉EXCEL呢?呃,是这样的,当时数据轻轻松上亿条,EXCEL怕是……

    回到正题,我们选定一个范围的数据之后,点击插入,数据透视表,确定。

    00c5d9385979be2d7bfe8e7fac5e092d.png

    简单的拖拉,我们就能得到这么一张汇总表:所有男鞋、女鞋、配件分别求和。

    2afafcc17048a8d6f8f5d43f972a206f.png

    再简单的拖拉,又能生成另一张表:按年汇总,品名列成小项,可折叠。如果把品名和年份位置对调,就是品名汇总,年份折叠。

    这玩艺儿用来应付那些一会儿要看这个表,一会儿要看那个表的领导非常好用。我总不可能天天蹲着给你做表格吧?给你一个数据透视,自己玩去。

    如果想要开发控件,我当年用的是DevExpress,非常强大,别无二选。就是有点贵,不过方法总是有的你懂的~

    6.几种排名方法

    这个之前有人问过,今天把几种情况一起写了。

    6c2dc7e88a130863c554a254f793241c.png

    首先是顺位排名,也就是不管前面有没有并列,真实反应该人的名次。

    这个很好解决,EXCEL自带RANK函数。但如果我们要让并列的人不占用名次,或者说不管并列多少名,不让排名数字有空档呢?比如100个人里,99个都考了100分,则考了98分的人,是第100名,还是第2名?

    这里我要事先说一下,此处的前提是不对数据进行排序,我们要在不动到之前数据的前提下来做。不要问我为什么,一问就说明你还没经历职场……如果能排序,那也没啥好讲的了~

    8adf920b8b7a9d8db8ee8b0421a1a05f.png

    函数不难:=SUMPRODUCT(($B$2:$B$7>B7)/COUNTIF($B$2:$B$7,$B$2:$B$7))+1。思路跟第1节的去重是一样的,不再重复解释。

    6d25d8dd18e4d658a3a5abda3c067786.png

    那如果有多个数值,在并列的时候需要做第二次排序呢?

    函数如下:RANK(B2,$B$2:$B$7)+SUMPRODUCT(($B$2:$B$7=B2)*($C$2:$C$7>C2))。

    思路也很简单,先取得真实名次,然后数出与其分数并列、第二排序列大于它的单元格个数,也就是这一格需要往后退(名次数值加上)的数值了。

    还是这个函数。记住SUMPRODUCT这个函数哦。

    7.制作下拉菜单

    有的时候,一些场合我们并不需要让用户自由输入,而是希望有个下拉菜单,提供现成的选项直接选项,这样既快捷,又避免输入错误,不使用VBA控件可以实现吗?

    49680917d21ce3154af731b5fa07074a.gif

    可以的,这个功能在EXCEL2007里叫“数据有效性”,2010之后的版本叫“数据验证”。在数据有效性功能内,选择“序列”,并且指定之前输好的固定值,就可以了。

    很典型的一个应用,省份选择,我们在寄、收快递的时候,都会让你选一个菜单。

    82a2f0e3ad1f04470c18639e67b4bb26.gif

    那么,如果要做多级菜单呢?比如省、市、区这样的?当然也可以。

    不过要先说一句,EXCEL2007做这个比较麻烦,我只是告诉大家旧版本的实现方法。有用新版本的朋友肯定是更方便了。

    一级菜单的做法不变,第二级菜单的话,我们需要先把它的下级预填出来,比如“北京”下面有某几个区。

    然后,以“北京”为头选中这个区域,公式,定义名称。在这里,2007版只能一个一个来,并且不能自动排除表头,所以我们得一个个手动。如果更高版本的朋友就有福了,EXCEL提供更多选项,可以直接指定表头,把整个区域一次性做进去。

    8.用录制宏完成高级功能

    上一节提到2007里,公式需要一个个手动点,而更高版本可以整个区域生成。那么我们有没有办法在旧版本里批量做呢?有的。

    请先记住一句话:所有功能,其本质都是宏(VBA代码),我们可以录制、编辑,实现自己的高级功能。

    b9cc43ba9fc4294757671633965b1207.png

    首先,我们需要调出“开发工具”选项卡。因为一般人用不到,出于安全考虑,默认是不显示的。

    ff9cdf3831138c60ab1f5ea80d4ed57d.gif

    然后,我们把刚才的单次操作录制成一个宏。录制方法也很简单,先切换到开发工具,点击录制宏。

    然后你就正常操作。操作完了之后,点击止录制。

    5d7f0d205645b194e1279eadf2f85153.png

    这时候切换到VBA界面,我们便可以看到刚才的代码,竟然只有两行,比鼠标点击的次数还要少。

    但是这时候我们并没有办法直接用,因为我们要做批量。比如,它这里的“北京”是写死的,我们必须让代码自动取值,等等。

    12efd8d37120cdf1966822903a0e39a4.png

    把代码稍加改造,这里我范例只有三个,列从8到10,所以循环的下标就从8到10。取得表头的名称之后,指定表身的部分即可。

    最后我们点击这个“播放”键,运行这个改造过后的宏。

    3665d3fdb89315b88368c8b06851458e.png

    执行完之后,我们来看一下名称管理器,确认一下有没有哪里写错。

    用代码的好处是什么呢?可以把很多批量的操作简化掉。比如我们在二级菜单的基础上,要做三级菜单。就算是新版本,你也得一个一个区域框选,因为一个省有N个市,一个市又有M个县,这样就需要N*M次操作。而通过代码,把数据布好局之后,只需要点一下,不管来多少数据,我们都不需要一次一次手动操作了。

    9.制作自定义函数

    071ec9ebcba788e952f35f4bda85f46c.png

    既然用到了一点VBA,那么最强大的是什么呢?当然是自定义函数了。

    自定义函数你就可以脱离EXCEL内置函数的限制,几乎想做什么就能做什么。具体要怎么干,就看每个人需求了。

    这里简单跟大家分享一下。首先,函数一定要写在模块里面,函数一定要写在模块里面,函数一定要写在模块里面。

    第二,函数前面加Public以供外部调用。

    第三,VBA用bdzjz_1 = s这样的方式来返回值(其他语言比较常见的是return xxx)

    第四,VBA的语法是弱属性,变量可以不声明类型。

    f31137fa55b1ccf63ea8b85814fe2f1d.gif

    函数写好之后我们可以来测试一下。在表格中键入等号,后面跟自定义函数名,如果成功的话可以看到完整函数名的提示。

    这里只是简单的将参数1和参数2中间连接起“住在”,最主要的还是知道自定义函数的方法。因为到了需要自定义函数阶段的时候,都是需求各异。

    10.为什么叫你们抛弃2003格式

    之所以聊到这个,主要是前段时间某群里有某人是这么说的:2003和2007的格式其实就是改个后辍骗人而已,内容是完全一样的,我的2003改个后辍就能打开2007的文件。

    这句话犯了几个很严重的错误:

    1.Office 2007最大的进步就是格式上的进步。旧的2003格式太易损坏,一旦出问题修复率几乎为零。

    2.2003能打开2007的文档,只是因为现在很多集成安装包带了兼容插件。就算如此,也只是能兼容常用内容,一些新特性根本用不了,也保存不了。

    3.微软没傻到单纯依靠后辍名来判断文件类型,事实上,大部分软件都没这么傻~

    598110cc6a3d69b500ea1bfc6f26b406.png

    不信我们来看看xls文件和xlsx文件的文件头,虽然看不懂,但是“明显不一样”这一点是可以确定的。

    而且在xlsx的文件头,我们可以看到xml这样的字样。有经验的朋友应该很熟悉了,对吧?

    简单来说,旧的2003格式是紧实的16进制内容,一旦损坏基本就没救了,有救过的朋友应该都感同身受。

    而2007格式呢?

    f2da1e1904adb4de5211c58ef64a6d68.png

    我们用WinRAR强行打开xlsx文件来看看,对没错,用WinRAR强行打开xlsx文件。

    2007的格式都以XML,说简陋点就是文本形式存储,然后用弱校验的类ZIP压缩。如果有损坏,则只会造成很少的数据损失。

    更通俗点来讲,2007的格式相当于一个记事本文件,或者视频文件。一小点地方坏了,结果就是一点乱码或者花屏。

    而2003格式一旦坏了,就像你安装游戏的时候,安装文件损坏……惨遭GG。

    微软给2003出兼容补丁是实属无奈,没想到十几年后,还有人抱着极易损坏的旧版本和旧格式不放。但我也明白,不是每个人都能换上最新版或者上Office365,所以折中一下用2007版本来演示,格式问题这是底限。我不是诅咒你们,但是万一辛辛苦苦做了几个月的PPT,或者积累了几年的数据突然损坏的时候,能不能救回来就在此一举了。

    afd1e8b89e6d966deb336d5e36a662ea.png

    好的,感谢大家观看,我是波导终结者,喜欢的朋友请点个关注和赞吧,有什么疑问欢迎留言,我们下期再见。

    展开全文
  • 题目:n个人围成一圈,顺序排号,第一开始报(1到3),凡报到3的人退出圈子,问最后最后留下的是原来第号的那位. 提示:用数组完成 方式(1) #include #define n 10 int main() { int a[n]; int i,quit_...
  • package www.bittech; public class Solution { public static void main(String[] args) { int[] people = new int[10]; //给每人编号 for(int i = 0;i<10;i++){ people...
  • 第一个人开始报1到3),凡报到3的人退出圈子,问最后留下的是原来第号。 例如;如果10个人 留下的是4号 这里我们使用数组来实现它。 数组初始化值1开始,如果有10个人,那么数组中存储的值就是[1-...
  • 函数部分主要函数的调用、函数的定义、函数的参数(参数部分比较难,相对于java增加了好多新的概念...举几个例子:#!/usr/bin/env python3# -*- coding: utf-8 -*-//abs() 获取绝对值,我们可以直接调用x = abs(10...
  • 第1个人开始报数(1-3报数),凡报到3的人退出圈子,问最后留下的是原来第号的那位?java代码如下:int n = 10;//n的取值int num = n;//记录剩余数个数int arr[] = new int[n];//标记剩余数的位置 0 代表存活,...
  • (公式含义:抽一个排一个,抽完后,除以3个的全排列) 特殊的, (含义:不用考虑顺序全拿走)问:有1,2,3,4,5这样五个数,需要选3个数,并且这三个数逐渐变大。有几种排法?答:抽出的3个数不同,且...
  • 附加: 第一 while 循环跑的过程k = 1 [1,2,3,4,5,6,7,8,9,10] num[0] = 1 k +=1 i += 1 ==> k = 1 i = 1 m = 0k = 2 [1,2,3,4,5,6,7,8,9,10] num[1] = 2 k +=1 i += 1 ==> k = 2 i ...
  • 第1个人开始报数(1-3报数),凡报到3的人退出圈子,问最后留下的是原来第号的那位? java代码如下: int n = 10;//n的取值 int num = n;//记录剩余数个数 int arr[] = new int[n];//标记剩余数的位置 0 ...
  • #include<iostream> using namespace std; int main() { int a[15]={15,14,13,12,11,10,9,8,7,6,5,4...//这题是小!!!!!!! int l=0,h=14,x,m; cout<<"输入查找的:"; cin>>x; ...
  • 一队列N个人,第一位开始报,报到3的人出列,后面的人继续1开始报,报到末尾后从头开始,如此反复。请确定最后一位是原队列中的第个人。N的值为正整数。 看到这道题目,以前做过。现在来复习一下吧: ...
  •  有10个孩子站成一圈,第一个孩子开始顺时针方向报,报到3的人出列,下一个 人继续1报,直到最后剩下一个孩子为止。问剩下第几个孩子。 代码如下:package com.cs.games; import java.util....
  • 连乘积的末尾有几个0? 答案是两个0。其中,因数10得到1个0,因数2和5相乘又得到1个0,共计两个。 刚好两个0?会不会再多几个呢? 如果不相信,可以把乘积计算出来,结果得到 原式=3628800。你看,乘积...
  • 首先每组中三个数从小大进行排序,组与组之间首先比较第一个数,小的在前,若第一个数相同,则比较第二个数,小的在前。” 明明在比赛中对这道题目想了很久,最终还是成功地...
  • 你的任务是:对于文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。 输入格式 输入有2行,第1行为3个正整数,用一个空格隔开: s t w (其中s为所...
  • #include //int make_sign[10];//标记数组,如:make_sign[1]=0表示 1这个数字没有走过 ...//n:一共有几个数,相当于每次走有几个路径可以选择 void combination(int m ,int n)//m个数里选 n个数 { int
  • 第一个人开始报1到3),凡报到3的人退出圈子,问最后留下来的是原来第号的那位。 public class Solution{ public static void main(String[] args) { int[] people = new int[10]; //给每人编号 ...
  • 总的算法口诀:、二十几到九十的同一十位均可按被乘数加乘数的位数之和,乘十、二十等的十位10、20……90等,再加上俩乘数的位数的相乘积,即得两乘数之积。 十的算法:如11X17=? (被...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 789
精华内容 315
关键字:

从3数到10有几个数