Board logo

标题: 批处理脚本实现C语言趣味编程百例012:肇事车牌照号 [打印本页]

作者: HAT    时间: 2012-4-7 22:28     标题: 批处理脚本实现C语言趣味编程百例012:肇事车牌照号

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

要求用BAT脚本实现:

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

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

*程序说明与注释
  1. #include<stdio.h>
  2. #include<math.h>
  3. int main()
  4. {
  5. int i,j,k,c;
  6. for(i=1;i<=9;i++) /*i:车号前二位的取值*/
  7. for(j=0;j<=9;j++) /*j:车号后二位的取值*/
  8. if(i!=j) /*判断二位数字是否相异*/
  9. {
  10. k=i*1000+i*100+j*10+j; /*计算出可能的整数*/
  11. for(c=31;c*c<k;c++); /*判断该数是否为另一整数的平方*/
  12. if(c*c==k) printf("Lorry–No. is %d.\n",k); /*若是,打印结果*/
  13. }
  14. }
复制代码
*运行结果
Lorry _No.is 7744
作者: canyuexiaolang    时间: 2012-4-8 09:55

  1. @echo off & setlocal enabledelayedexpansion
  2. for /l %%i in (11 11 99) do (
  3. for /l %%j in (99 -11 11) do (
  4. if not %%i equ %%j (
  5. for /l %%x in (32 1 100) do (
  6. set /a "n=%%x*%%x"
  7. if "%%i%%j"=="!n!" echo %%i%%j
  8. ))))
  9. pause
复制代码


fuck。。感觉不太好。。
作者: fatcat    时间: 2012-4-8 10:16

  1. @echo off & setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 99) do (
  3.   set/a"t=%%i*%%i*11,j=(t-100^^t-909)>>31&^!(t/10%%10)&^!^!(t/100-t%%10),t*=11"
  4.   if !j!==1 echo %%i : !t!
  5. )
  6. pause
复制代码

作者: neorobin    时间: 2012-4-8 10:20

回复 3# fatcat


    分析:
这个数表示成
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

回复 4# neorobin
继续分析
前后两个数相加一定是11(即A+B=11)
也因为这个数是个平方数 所以后一数字一定4 5 6 9(因为小于10) 所以排除掉 0 1
因此这个数一定 在7744 6655 5566 2299 这4个数中
但程式的推断 还是比现在复杂点
作者: batman    时间: 2013-10-22 01:01

本帖最后由 batman 于 2013-10-22 01:05 编辑

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

作者: 依山居    时间: 2015-11-25 04:47

  1. """
  2. python肇事车牌照号
  3. http://www.bathome.net/thread-16242-1-1.html
  4. 依山居 4:28 2015/11/25
  5. """
  6. aabb=[str(r)+str(r)+str(s)+str(s) for r in range(1,10) for s in range(1,10)]
  7. [print(r,r*r) for r in range(1,100) if (str(r*r) in aabb)]
复制代码
代码量不小~
作者: 依山居    时间: 2015-11-25 05:01

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

作者: 依山居    时间: 2015-11-25 05:31

  1. #正则还能这样写
  2. print(re.sub(r".*=(\d)\1(\d)\2.*",r"\1\1\2\2",aabb))
复制代码

作者: 依山居    时间: 2015-11-25 13:26


拼成一行代码~
  1. 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))])
复制代码

作者: 依山居    时间: 2015-11-25 13:54

本帖最后由 依山居 于 2015-11-25 13:59 编辑
  1. [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))]
复制代码
再改成这样。
作者: 依山居    时间: 2015-11-25 18:40

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





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2