今天的C作业,稍微用php写了一下,C大概也可以用差不多的方法吧
迟点再把C的实现写了,先贴php的。

问题是这个:

在一次竞赛中,ABCDE五个人最终取得了自己的名次,现在知道,
C不是第一名;
D比E低两个名次;
E不是第二名;
A既不是第一名也不是最后一名;
B比C低一个名次。
要求写程序,计算他们各自的名次。

以下是用php的实现:

<?php
$count = 11111;
$qwq = str_split($count);
$pattern = '/^[1-5]{5}$/';

while ($count >= 11111 && $count <= 55555){
    $qwq = str_split($count); //分割字串,便于计算
    $a = $qwq['0'];
    $b = $qwq['1'];
    $c = $qwq['2'];
    $d = $qwq['3'];
    $e = $qwq['4'];
    if ($c!=1 && $e!=2 && $d==$e+2 && $a!=1 && $a!=5 && $b==$c+1){
        if (
            $a!=$b && $a!=$c && $a!=$d && $a!=$e && 
            $b!=$c && $b!=$d && $b!=$e && 
            $c!=$d && $c!=$e && 
            $d!=$e         //确保不会出现有两个人是同一个名次
        ){
            if (preg_match($pattern,$count,$result)){
                print_r($result);
            }
        }
    }
    $count++;
}

最终输出:

shirosatosu@ubuntu:~/rank$ php rank.php 
Array
(
    [0] => 25431
)

所以最终结果是,A第二名;B第五名;C第四名;D第三名;E第一名。

大概的思路就是先把ABCDE对应到个十百千万位,
然后再按题目给的条件筛选一下。
但是,最后的出来的结果会存在有人的排名大于5,
那么这种情况就可以用正则表达式 /^[1-5]{5}$/ 把有问题的结果匹配掉。

那么最后就只剩下唯一一个结果:25431

至于C的实现,估计也差不多,但是因为C是强类型语言,如果想要像php那样玩字符串分割的话就得把变量类型变来变去,非常麻烦,
所以C的话就需要一开始就全部用int来做,用数学方法提取数字中的个十百千万位,like this ↓

int a,b,c,d,e;
int count = 11111;
a = count/1%10;     // 个位
b = count/10%10;    // 百位
c = count/100%10;   // 十位
d = count/1000%10;  // 千位
e = count/10000%10; // 万位

然后C的话大概可以这样子:

#include <stdio.h>
void main() {
    int a,b,c,d,e;
    int count = 11111;

    while (count >= 11111 && count <=55555){
        a = count/1%10;
        b = count/10%10;
        c = count/100%10;
        d = count/1000%10;
        e = count/10000%10;

        if (c!=1 && e!=2 && d==e+2 && a!=1 && a!=5 && b==c+1){
            if (a!=b && a!=c && a!=d && a!=e && 
                b!=c && b!=d && b!=e && 
                c!=d && c!=e && 
                d!=e ){
                if(a>5 || b>5 || c>5 || d>5 || e>5 ||
                   a==0 || b==0 || c==0 || d==0 || e==0){
                    goto pwp;
                }
                else {
                    printf("%d%d%d%d%d \n",a,b,c,d,e);
                }
            }
        }
        pwp: count++;
    }
}

运行:

shirosatosu@ubuntu:~/rank$ ./rank
25431 

完 全 一 致



说起字串分割的问题还有一点想说的事情,
就是在php里,直接用 str_split 分割中文会出问题,
所以在网上找来了一个这个

function mbstringToArray($str,$charset) {
   $strlen=mb_strlen($str);
   while($strlen){
     $array[]=mb_substr($str,0,1,$charset);
     $str=mb_substr($str,1,$strlen,$charset);
     $strlen=mb_strlen($str);
   }
   return $array;
 }



还有一点想吐槽的就是,在机房拷回来的代码居然是这样的
字符集问题
都8102年了(摊手

标签: none

添加新评论