标题: 批处理脚本实现C语言趣味编程百例012:肇事车牌照号 [打印本页]
作者: HAT 时间: 2012-4-7 22:28 标题: 批处理脚本实现C语言趣味编程百例012:肇事车牌照号
加分:1个技术分或者10个PB
要求用BAT脚本实现:
抓交通肇事犯一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同; 丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。
*问题分析与算法设计
按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。
*程序说明与注释- #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); /*若是,打印结果*/
-
- }
- }
复制代码
*运行结果
Lorry _No.is 7744
作者: canyuexiaolang 时间: 2012-4-8 09:55
- @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
复制代码
fuck。。感觉不太好。。
作者: fatcat 时间: 2012-4-8 10:16
- @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
复制代码
作者: 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来满足题目中的条件:- @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
复制代码
作者: 依山居 时间: 2015-11-25 04:47
- """
- 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)]
复制代码
代码量不小~
作者: 依山居 时间: 2015-11-25 05:01
- """
- 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]
复制代码
作者: 依山居 时间: 2015-11-25 05:31
- #正则还能这样写
- print(re.sub(r".*=(\d)\1(\d)\2.*",r"\1\1\2\2",aabb))
复制代码
作者: 依山居 时间: 2015-11-25 13:26
拼成一行代码~- 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 编辑
- [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
- 改进,排除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]
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |