批处理之家's Archiver

HAT 发表于 2012-4-7 22:28

批处理脚本实现C语言趣味编程百例012:肇事车牌照号

加分:1个技术分或者10个PB

要求用BAT脚本实现:

抓交通肇事犯一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同; 丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。

*问题分析与算法设计
按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。

*程序说明与注释[code]#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k,c;
for(i=1;i<=9;i++) /*i:车号前二位的取值*/
for(j=0;j<=9;j++) /*j:车号后二位的取值*/
if(i!=j) /*判断二位数字是否相异*/
{
k=i*1000+i*100+j*10+j; /*计算出可能的整数*/
for(c=31;c*c<k;c++); /*判断该数是否为另一整数的平方*/
if(c*c==k) printf("Lorry–No. is %d.\n",k); /*若是,打印结果*/

}
}[/code]*运行结果
Lorry _No.is 7744

canyuexiaolang 发表于 2012-4-8 09:55

[code]@echo off & setlocal enabledelayedexpansion
for /l %%i in (11 11 99) do (
for /l %%j in (99 -11 11) do (
if not %%i equ %%j (
for /l %%x in (32 1 100) do (
set /a "n=%%x*%%x"
if "%%i%%j"=="!n!" echo %%i%%j
))))
pause[/code]

fuck。。感觉不太好。。

fatcat 发表于 2012-4-8 10:16

[code]@echo off & setlocal enabledelayedexpansion
for /l %%i in (1 1 99) do (
  set/a"t=%%i*%%i*11,j=(t-100^^t-909)>>31&^!(t/10%%10)&^!^!(t/100-t%%10),t*=11"
  if !j!==1 echo %%i : !t!
)
pause[/code]

neorobin 发表于 2012-4-8 10:20

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=106022&ptid=16242]3#[/url] [i]fatcat[/i] [/b]


    分析:
这个数表示成
1000a+100a+10b+b=1100a+11b=11(100a+b)  (a∈[1,9], b∈[0,9], a≠b)
100a+b ∈[100, 908]
第 3 位 ≠ 第 1 位
第 2 位 = 0

100a+b 必是 11 的倍数, 而且对 11 的商必是一个平方数

从 最小的平方数 1*1, 2*2, 3*3... 搜索到一个满足以上所有条件的数即是解之一.

terse 发表于 2012-4-9 02:33

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=106023&ptid=16242]4#[/url] [i]neorobin[/i] [/b]
继续分析
前后两个数相加一定是11(即A+B=11)
也因为这个数是个平方数 所以后一数字一定4 5 6 9(因为小于10) 所以排除掉 0 1
因此这个数一定 在7744 6655 5566 2299 这4个数中
但程式的推断 还是比现在复杂点

batman 发表于 2013-10-22 01:01

[i=s] 本帖最后由 batman 于 2013-10-22 01:05 编辑 [/i]

分析最小的四位数是1000,最大的四位数是9999,目测知道31的平方接近于并小于1000,100的平方接近并大于9999,于是再用四个if来满足题目中的条件:[code]
@echo off&setlocal enabledelayedexpansion
for /l %%a in (31,1,100) do (
  set /a a=%%a*%%a
  if "!a:~,1!" equ "!a:~1,1!" if "!a:~2,1!" equ "!a:~3,1!" if "!a:~,1!" neq "!a:~2,1!" echo,!a!
)
pause>nul
[/code]

依山居 发表于 2015-11-25 04:47

[code]"""
python肇事车牌照号
http://www.bathome.net/thread-16242-1-1.html
依山居 4:28 2015/11/25
"""
aabb=[str(r)+str(r)+str(s)+str(s) for r in range(1,10) for s in range(1,10)]
[print(r,r*r) for r in range(1,100) if (str(r*r) in aabb)]
[/code]代码量不小~

依山居 发表于 2015-11-25 05:01

[code]"""
python正则匹配肇事车牌照号
http://www.bathome.net/thread-16242-1-1.html
依山居 4:50 2015/11/25
"""
import re
aabb=["%d*%d=%d" %(r,r,r*r) for r in range(1,100)]
aabb=str(aabb)
result=re.findall(r"(\d)\1\*\1\1=(\d)\2(\d)\3",aabb)
[print(a*2,b*2+c*2) for a,b,c in result]
[/code]

依山居 发表于 2015-11-25 05:31

[code]#正则还能这样写
print(re.sub(r".*=(\d)\1(\d)\2.*",r"\1\1\2\2",aabb))[/code]

依山居 发表于 2015-11-25 13:26

:lol
拼成一行代码~[code]print("号码:",[r*r for r in range(1,100) if ((r*r>999) and (r*r<10000) and (int(r*r/1000)==int(r*r/100%10) and int(r*r/1000)!=int(r*r/10%10) and int(r*r/10%10)==r*r%10))])
[/code]

依山居 发表于 2015-11-25 13:54

[i=s] 本帖最后由 依山居 于 2015-11-25 13:59 编辑 [/i]

[code][print("号码:",r*r) for r in range(1,100) if ((r*r>999) and (r*r<10000) and (int(r*r/1000)==int(r*r/100%10)!=int(r*r/10%10) and int(r*r/10%10)==r*r%10))]
[/code]再改成这样。

依山居 发表于 2015-11-25 18:40

[code]改进,排除a=b,不再使用类型转换
aabb=[r*1000+r*100+s*10+s for r in range(1,10) for s in range(1,10) if (r!=s)]
[print("号码:",r*r) for r in range(1,100) for ab in aabb if r*r==ab][/code]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.