前些日子积累的代码——其实就当做数学题了

来源:互联网 发布:c语言怎么打开特定文件 编辑:程序博客网 时间:2024/05/17 20:08

第一次写博客,感觉有点不一样,但是又感觉木啥要说的,哥喜欢直接,上代码先!

第一个

觅夜的黑:设2n张牌分别标记为1,2,…,n,n+l,…,2n,初始时这2n张牌按其标号从小到大排列。
经一次洗牌后,原来的排列顺序变成n+l,l,n+2,2,··,,2n,n。
即前n张牌被放到偶数位置2,4,·,·,2n,而后n张牌被放到奇数位置1,3,…,2n-l。可以证明对于任何一个自然数n,经过若干次洗牌后可恢复初始状态。
问:编程计算最少经过多少次洗牌可恢复到初始状态。

import java.util.Scanner;public class Exce03 {    public static void main(String[] args) {        //输入n        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        //洗牌次数        int times = 1;        //洗牌终止条件        boolean finish = true;        //每张牌的位置        int index = 1;        //以n+1这个数变换位置为例,其余的一样。        while(finish){            //洗牌中的两种规则            if(index>n){                //如果大于n就是后n位,他的位置就是2(index-n-1)+1,这是从右往左数的奇数位置。                index = 2*(index-n-1)+1;            }else{                //如果小于n,他的位置就是每次乘以2                index*=2;            }            times++;            /*它返回原来位置的时候,就是洗牌结束的时候             *其实可以把循环设置成死循环,到这里直接break就行了             */            if(index==(n+1)){                finish = false;            }        }        System.out.println(times);    }}

第二个

小白聪聪:有一个人去店里买酒,明知店里有两个舀勺,分别能舀七两和十一两酒,却硬要老板给他二两,老板在两个勺子中将就倒来倒去,竟真倒出二两酒来。请用程序写出过程。

int cbig = 0;//11代表大勺子的剩余量int clit = 0;//7代表小勺子的剩余量int count = 0;//代表循环的次数while(clit!=2){    count++;    clit = 7;    System.out.println("把小勺装满倒入大勺");    //cbig = cbig+7;    if(cbig+7>=11){        clit = 7-(11 - cbig);         System.out.println("小勺剩"+clit+"两");        System.out.println("大勺满了,倒空,把小勺剩下的"+clit+"两倒入大勺");        cbig = clit;     }else{         System.out.println("小勺全部倒入大勺,小勺空了");         System.out.println("大勺现有"+cbig+"两");         cbig = cbig +7;    } } System.out.println(count);

第三个

MissGreeen:一个自然数能够表示成一个自然数的平方,那么这个自然数是完全平方数。现在有个完全平方数,它加上100后也是个完全平方数,再加上168,还是一个完全平方数。请写出一个程序,来算出这个数是多少?
这题哥没用程序写出来。
哥的回答:其实也可以不用程序就能算出来,当然要逻辑推理。我的思路是这样的:用数列来解答
首先完全平方数就是这样:1,4,9,16,25,36,49,64……
他们有个特点,他们每两个之间的差是这样:3,5,7,9,11,13,15……是一个等差数列。
放到这一题中,100就可以认为是等差数列其中一段的和。
而这个等差数列的和也有规律:因为他们都是奇数,根据奇数个奇数的和还是奇数,偶数个奇数的和是偶数这个规律,我们可以得出结论:
100是这个数列中偶数个连续项相加的结果。
而对于这个数列偶数个数相加的情况,可以用等差数列的求和公式来解:数的个数乘以这些数的中位数(中位数,举个列子5和7的中位数是6,
5和9的中位数是7,就是这两个数相加的和除以2)即是和。
因为这个等差数列的等差是2,所以中位数也很有特色,偶数个数的时候,中位数是偶数,奇数个数的时候中位数是奇数。
这里100是偶数,则中位数是偶数。
那么我们可以得出结论:100应该是哪两个偶数的乘积呢?两种情况:10乘10 ,,,50乘2
下面来分析这两种情况:
1,如果是10乘10,也就是说,有十个数,中位数是10,那么我们得到这十个数,最中间的两个数是9和11,这个数列也出来了,
是1,3,5,7,9,11,13,15,17,19。但是我们得知道,这个数列是由完全平方数的后一个数减前一个数得到的,最小的应该是3,这里得到的
是1,所以这种情况不行,pass
2、如果是50乘以2呢,有得分两种情况,数的个数是50和数的个数是2,用第一种情况分析就知道,个数是50肯定不行,第一个数都成负的了。
那么就剩个数是2这种情况了,这就简单的多了,两个数中位数是50,答案很显然是49,51。得到数列之后,我们该找完他前面的完全平方数了。
3,5,7,9,11,13,15,17……这个数列的通项公式是:2n+1,也就是说第n项的数是2n+1,那么49是第24(别说2n+1=49都算不出来是几)项。
而1,4,9,16,25,36,49,64……这些完全平方数通项公式是:n的平方。到这里,我们就求出这个完全平方数是24的平方即576。
下面验证一下:576加100等于676,而676是26的平方。
按这一题来,还要加168,得到844,而28的平方是784,29的平方是841,30的平方是900,好吧,这题无解了。

话说楼主没有抄错题??确定是168而不是108??如果是108的话,得到784便是28的平方,这题就有答案了,结果是576!!!!

第四个

这是哥无意间碰到的,题目是:喝酒,一瓶酒2元,四个瓶盖可以换一瓶酒,2个瓶子可以换一瓶酒,问十块钱能喝几瓶酒?

        int gaizi = 0;//剩余盖子的数量        int pingzi = 0;//剩余瓶子的数量        int count = 0;//总共喝的瓶子数量        int countxx = 0;//上一次瓶子的数量        int money = 0;//钱        Scanner sc = new Scanner(System.in);        System.out.println("请输入钱数:");        money = sc.nextInt();        //初始化        count = money/2;        gaizi = count;        pingzi = count;        countxx = count;        do{            count += gaizi/4+pingzi/2;            gaizi = gaizi%4+(count-countxx);            pingzi = pingzi%2+(count-countxx);            countxx = count;        }while(gaizi>=4||pingzi>=2);        System.out.println(count);

第五个

韩信点兵问题,一个数除以3余1,除以5余3,除以7余4,求这个数
这个题用程序最好做了

int n = 4;while(true){    if(n%3==1&&n%5==3&&n%7==4){        System.out.println(n);//其实这样的数有很多的,这样要最小的        break;    }    n++;}

这个题虽然简单,但是有时候不一定有答案,如果3个被除数是
三个质数,一定有解。

0 0
原创粉丝点击