每天两题04

  本来昨晚就准备看两个题的,结果下班回来躺了一下就睡着了,今天继续,嘿嘿(^.^)

题目一:二进制中1的个数

  题目描述:输入一个整数,输出该数二进制表示中 1 的个数。

  思路:第一眼看到这个题目的我想法是首先将这个数转成二进制字符串,然后通过遍历这个字符串中的每一个元素是不是等于1,然后用个int类型的数值去计算,代码如下:

public static int oneNum(int n) {
        String string = Integer.toBinaryString(n);
        int count = 0;
        for (int i = 0; i < string.length(); i++) {
            if (string.charAt(i) == ‘1‘) {
                count++;
            }
        }
        System.out.println("数字对应的二进制为:"+string);
        return count;
    }

    public static void main(String[] args) {
        System.out.println("二进制中1的个位为:"+oneNum(24));
    }

//运行结果:
//数字对应的二进制为:11000
//二进制中1的个位为:2

  后来找了看了一下别人的解法,很奇特的思路,直接运用位运算来就可以了,比如输入的是6,对应的二进制为110,我们将6和(6-1)做“按位与”运算,就可以将110中后面的1去掉,此时得到的是100,然后将这个数和当前数减一,也就是000做位运算,就可以又去掉一个1了,此时得到的结果就是000

  综上所述,假如有一个数n,我们只需要无限的计算n = n&(n-1),每计算一次计数的变量就加一,直到n等于0,此时就得到了1的个数,代码如下,这个的效率高很多

public static int oneNum2(int n){
        int count = 0;
        while (n!=0) {
            n &= (n-1);
            count ++;
        }
        return count;
    }
    public static void main(String[] args) {
        System.out.println("二进制中1的个位为:"+oneNum2(24));//2
    }

题目二:数值的整数次方

  题目描述:给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent,求 base 的 exponent 次方。

  思路:最直接的想法,根据整数 exponent循环,每循环一次就乘以base,代码如下(不考虑exponent为负数的情况,其实考虑的话也很容易,那结果就是1/result):

public static double pow(double base, int exponent) {
        double result = base;
        for (int i = 1; i < exponent; i++) {
            result *= base;
        }
        return result;
    }

    public static void main(String[] args) {
        System.out.println(pow(1.2, 2));//1.44
    }

  很明显,这样的效率不是很好,这里可以用递归做,举个例子,如果是2x2x2x2x2x2,这里有6个2相乘,为什么我们要从前一个一个乘呢?先算前面两个2相乘的结果为4,然后再6/2==3次方就好了,由于6是偶数,所以继续下一次递归;然后我们计算前面两个4相乘结果为16,然后再3/2==1次方,由于3是奇数,要再乘以4。。。代码如下:

public static double pow2(double base, int exponent) {
        //这个是递归的出口
        if (exponent==1) {
            return base;
        }

        double result = pow2(base*base,exponent/2);
        //在递归中每一次都要对传入的exponent进行判断是不是奇数,是的话就多乘以一个base,比如有传入的是2.0和10,第一次递归就是4.0和5,注意:
        //这里会进行第二次递归传入的是16.0和5/2=2,所以在第二次递归调用完毕之后回来会多乘以一个4.0
        if (exponent%2 == 1) {
            result *= base;
        }
        return result;
    }

    public static void main(String[] args) {
        System.out.println(pow2(3.0, 3));//27.0
    } 

原文地址:https://www.cnblogs.com/wyq1995/p/11562291.html

时间: 2024-11-25 10:57:02

每天两题04的相关文章

BestCoder Round #4 前两题 hdu 4931 4932

第一题太水了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int a[6]; 7 int main(){ 8 int cas; 9 scanf( "%d", &cas ); 10 while( cas-- ){ 11 for( int i = 0; i <

(莫队算法)两题莫队算法统计数量的入门题

因为这两题差不多,而且比较简单,就放一起,做了这题,这种题目就是巨水的题了.随便写都行. CodeForces - 86D  Powerful array 题意: 多次查询数列中从L到R每个数字出现次数的平方乘这个数字的和. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #include <map> 6 #includ

最近切的两题SCC的tarjan POJ1236 POJ2186

两题都是水题,1236第一问求缩点后入度为0的点数,第二问即至少添加多少条边使全图强连通,属于经典做法,具体可以看白书 POJ2186即求缩点后出度为0的那个唯一的点所包含的点数(即SCC里有多少点) //poj1236 #include<iostream> #include<cstdio> #include<string.h> #define maxn 6000 int now=0,next[maxn],head[maxn],point[maxn],num=0,dfn

codechef 两题

前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM,不过他求得是XOR最大值,原理类似.. B:KMP居然写搓了,后来一直改,题目放个链接好了:http://www.codechef.com/LTIME14/problems/TASHIFT. 我么可以对B字符串复制一下,然后再对A字符串求出NEXT数组,再匹配的过程中求出匹配最大长度时的位置, 刚开始我没想

挑战JavaScript正则表达式每日两题

不少学习JS开发的同学可能对正则表达式抱有不屑一顾的态度,认为用到时再查查不就行了.以前在学习其他语言,例如JAVA和C#时,我就有这么一种观点--反正看了不用就忘. 但是,JS开发中,你无论是自己开发还是观看别人的模块或者第三方库,你会更为频繁地使用到正则表达式.因此,正则表达式一下子变得不再是可有可无. 从本篇开始,我打算使用大致10多天时间,开发二十多个题,都是有关正则表达式的使用问题,权作JAVASCRIPT开发朋友的一种小型讨论聚会,但绝不是什么"擂台"赛.问题给出后,将在下

Educational Codeforces Round 58 (Rated for Div. 2) (前两题题解)

感慨 这次比较昏迷最近算法有点飘,都在玩pygame...做出第一题让人hack了,第二题还昏迷想错了 A Minimum Integer(数学) 水题,上来就能做出来但是让人hack成了tle,所以要思考一下具体的过程 原本我是认为直接把d进行累加看什么时候不在那个segment内也就是那个范围之内结果tle 今天思考一下发现有两种情况 ①如果d本来就是小于左边界的那么就输出d就可以了,因为样例明确提示有原来的数也可以 ②然后就是如果d在范围之内或者范围外可以用余数来确定具体的数公式是: an

【网络流24题----04】软件补丁问题魔术球问题

问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可放11个球. ´编程任务: 对于给定的n,计算在 n根柱子上最多能放多少个球. ´数据输入: 文件第1 行有 1个正整数n,表示柱子数. ´结果输出: 文件的第一行是球数. 数据规模 n<=60  保证答案小于16

BestCoder Round #13(前两题)

这一次又只出了一题,第二题没有分析好,竟然直接copy代码,不过长见识了.. 第一题给了一些限制条件,自己没有分析好,就去乱搞,结果各种不对,后来有读题才发现..暴力乱搞.. 题目: Beautiful Palindrome Number Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 657    Accepted Submissio

BestCoder 2nd Anniversary的前两题

Oracle Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 79    Accepted Submission(s): 41 Problem Description There is once a king and queen, rulers of an unnamed city, who have three daughters