php 求解多项式

1 篇文章 0 订阅

好久没有做过算法相关的东西了,最近一个同事问了一个算法相关的问题,问题描述如下:

有这样一组排列对应关系,26个大写字符组成的字符串按字符序排序,短的比较小

A=>1,B=>2,。。。Z=>26,AA=>27,。。。AZ=52  。。。

现在给出数字m,要找出对应的字符串是什么,如下

1 => A , 27 => AA ...

这个问题比较熟悉,以前遇到过,不过当时自己怎么解决的就想不起来了。

现在的解法如下:

大致思路

10进制变26进制

多项式 :m = x1*26^n + x2*26^n-1+...+xn*26^0(注意:1<=  xi <= 26)

代码:

<?php
$a = intval($argv[1]);

function ans($a)
{
    $arr = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $res = 0;

    $len = strlen($a);
    for($i = 0; $i<$len; $i++) {
        $res = $res*26 + (ord($a[$i]) - ord('A') + 1);-
    }   
    return $res;
}

function func($a)-
{
    $arr = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $res = ''; 

    while($a > 0) {
        $x = $a%26;
        if($x == 0) { #这里要注意
            $x = 26; 
        }   

        $res = $arr[$x].$res;
        $a -= $x; #这要注意
        $a = intval($a/26);
    }   

    return $res;
}
$b = func($a);
$j = ans($b);

echo $a,"\n",$b,"\n",$j,"\n";
if($a != $j){
    echo "algorithm error\n";
}else{
    echo "succ\n";
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值