每周一道算法题001:回文数

题目:

找出大于10的最小的2进制,8进制,10进制都是回文数的最小的数。回文数指的是正读和反读都是一样的数,例如:33,10001,123454321...

思路:

先转换进制,然后统一处理成字符串进行比较

解答:

PHP

function execute(){
    $x = 11;
    while (1) {
        if ($x == strrev($x)
            && decbin($x) == strrev(decbin($x))
            && decoct($x) == strrev(decoct($x))) {
            break;
        }
        $x += 2;
    }
    return $x;
}

$result = execute();
echo $result;

golang

package main

import (
    "fmt"
    "strconv"
)

func main() {
    result := Execute()
    fmt.Println(result)
}

func Execute() string {
    xStr := ""
    for x := 11; ; x += 2 {
        xStr = strconv.Itoa(x)
        xBin := strconv.FormatInt(int64(x), 2)
        xOct := strconv.FormatInt(int64(x), 8)
        if xStr == Reverse(xStr) && xBin == Reverse(xBin) && xOct == Reverse(xOct) {
            break
        }
    }
    return xStr
}

// 字符串翻转
func Reverse(s string) string {
    runes := []rune(s)
    for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 {
        runes[from], runes[to] = runes[to], runes[from]
    }
    return string(runes)
}

原文地址:https://blog.51cto.com/ustb80/2419235

时间: 2024-10-09 22:40:20

每周一道算法题001:回文数的相关文章

算法趣题之回文数

题目:求用十进制.二进制.八进制表示都是回文数的所有数字中,大于十进制数10的最小值. 啥叫回文数:如果把某个十进制数按相反的顺序排列,得到的数和原来的数相同,则这个数就是"回文数".例如12321就是一个回文数. 这个题目拿Ruby.JavaScript.python.Java都很容易实现,因为这些语言都提供了字符串逆序处理的接口,或者相关其他接口,而C语言没有提供直接转换的接口,所以下面用C语言解题,其中设计的封装在工作中也会经常碰到,故记录并分享,如有错误或者有更好的算法,欢迎留

第二届战神杯线上编程挑战赛月赛第一题:回文数

题目详情: Njzy学习了回文串后联想到了回文数,他希望统计出一个区间内的全部回文数.如今给定一个闭区间[a,b],求这个区间里有多少个回文数. 比方[20,30],仅仅有一个回文数那就是22. 输入描写叙述: 输入包括多组測试数据,每组測试数据包括两个整数a,b, (0<a<=b<10^6). 输出描写叙述: 对于每组測试数据输出对应的答案. 答题说明: 输入例子: 1 10 20 30 300 400 输出例子: 9 1 10 解题思路: total[i]代表从1到i之间有多少回文数

LeetCode刷题-009回文数

判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数 示例 1:输入: 121输出: true 示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 . 从右向左读, 为 121- .因此它不是一个回文数. 示例 3:输入: 10输出: false解释: 从右向左读, 为 01 .因此它不是一个回文数. 进阶:不将整数转为字符串来解决这个问题 1 class Solution { 2 public: 3 bool isPalindrom

【数据结构与算法】数学——回文数

回文数 LeetCode:回文数 题目描述: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例: 输入: 121 输出: true 思想: x%10得到尾数,x/d(d为10的x的位数次方)得到首位数字,比较二者是否相同: 注意:循环条件必须是x>0而不是x>10.当x为个位数时,如果是中心位置必然是true,但如果是1000021这种情况(不是回文数),x最后为2,此时x%10跟x/d不相等需要再判断一轮. 代码: class Solution

每周一道算法题005:切木棒

问题: 假设要把长度为n厘米的木棒切分为1厘米长的小段,但是1根木棒只能由1人切分,当木棒被切分为3段后,可以同时由3个人分别切分木棒.求最多有m个人时,最少要切分几次. 譬如n=8,m=3时如下图所示,切分4次就可以了. 求当n=20,m=3时的最少切分次数.求当n=100,m=5时的最少切分次数. 思路: 这道题最难的不是算法,而是理解题意.木棒刚开始只有1根,题目规定"1根木棒只能由1人切分",此时由1人切分后,变成2根:2根木棒再做切分,也要满足"1根木棒只能由1人切

每周一道算法题003:翻牌

问题: 有100张写着数字1-100的牌,并按顺序排列.最开始所有牌都是背面朝上放置.某人从第2张牌开始,隔1张牌翻牌.然后第2, 4, 6, -,100张牌就会变成正面朝上.接下来,另一个人从第3张牌开始,隔2张牌翻牌(原本背面朝上的,翻转成正面朝上:原本正面朝上的,翻转成背面朝上).再接下来,又有一个人从第4张牌开始,隔3张牌翻牌.像这样,从第n张牌开始,每隔n-1张牌翻牌,直到没有可翻动的牌为止.求当所有牌不再变动时,所有背面朝上的牌的数字. 思路: 这道题思路有很多种: 思路1设i为轮次

每周一道算法题002:四则运算

问题: 求位于1000-9999,满足如下条件的数: 各位数字间加入四则运算符,也可省略,使得按四则运算计算的结果为原数字的各位数逆序排列. 例如:351 → 3×51 = 153 思路: 遍历1000-9999所有的数字,切分并组合运算符,拼成四则运算的算式然后计算.4位数中最大的数是9999,他可以被拆成999+9=1008,逆排后不可能等于原数,减法和除法不可能计算出比原数更大的数,所以只需要考虑乘法. php提供了eval函数,可以很方便的计算,但是需要对数字进行处理,因为08开头的数字

每周一道算法题:兑换零钱

问题: 已知可兑换的零钱种类有1元,5元,10元,20元4种,现在有100块钱要换成零钱且总数量少于15张,有几种换法?分别是什么? 思路: 已知有[1,5,10,20]这样的一个可选数据集S,现在要从中取出n个数,每个数的张数为a,使得a1xn1+a2xn2+...aixni = 100. 最大的面额是20,总共需要100/20=5张,这是最少的张数,所以循环的下限是5,上限题目已经限定了,是15. 也就是说,从S这个数据集中,取5-15个数,使得他们的和为100,数是可以重复的. 先考虑最简

每周一道算法题009:找二进制对称的日期

题目: 把年月日表示为YYYYMMDD这样的8位整数,然后把这个整数转换成二进制数并且逆序排列,再把得到的二进制数转换成十进制数,求与原日期一致的日期.求得的日期要在上一次东京奥运会(1964年10月10日)到下一次东京奥运会(预定举办日期为2020年7月24日)之间. 思路: 从起始时间开始逐天累加,对每一天进行进制转换并反转,然后比较,如果相同就输出,不同就继续,直至到达结束时间. 解答: php: function findDate($begin, $end) { $beginDate =