华为面试题,改了一下,你会吗?^_^

xkw365 2007-09-13 08:50:55
一个五位数字ABCDE*4=EDCBA,这五个数字不重复,请编程求出来.要求:不准用for,while,if,switch语句
...全文
1933 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
strip 2008-03-29
  • 打赏
  • 举报
回复

[Quote=引用 62 楼 arong1234 的回复:]
如果大家一定要确保有无解退出的解,如下

template <int i>
int result()
{
return ((i> =10000 &&i<=10000 || i*4==(10000*(i%10) + 1000*((i/10)%10)) + 100*((i/100)%10))+10*((i/1000)%10)) + ((i/10000)%10)))?(i):(template sum <i-1> ()));
}

#include <iostream>
using namespace std;
int main()
{
int iResult = result <30000> ;
cout < < (iResult > 10000)?(iResult):( "no such number ")) < < endl;
}
[/Quote]
ren_xu123 2007-09-19
  • 打赏
  • 举报
回复
yevv(荷柴樵夫) :
高人!!!!!!!!!!!1
xkw365 2007-09-19
  • 打赏
  • 举报
回复
ls辛苦了,呵呵
中间件XL 2007-09-19
  • 打赏
  • 举报
回复
解题思路:
正常的话只要if/for就可以解决问题,for,while,if,switch不能用,那可以用其他来模拟if/for就可以。if可以用"?:"加上内部类(对C++就是函数指针)来模拟,for可以用递归模拟。
另外:
E->A
E,D->B 因此只要穷举EDC,验证ABCDE是否互不相等就可以。
代码如下(java6.1通过):
import java.lang.Math;

public class test {
// 抽象语句类
abstract class Statement {
protected int A,B,C,D,E;
abstract void Execute();
public void Assign(Statement s) {
A=s.A;
B=s.B;
C=s.C;
D=s.D;
E=s.E;
}
}
// 空操作语句
class ST_NOP extends Statement {
public void Execute() {
return;
}
}
//
class ST_PrintABCDE extends Statement {
public void Execute() {
System.out.print(A);
System.out.print(B);
System.out.print(C);
System.out.print(D);
System.out.println(E);
}
}
//
class ST_FindABCDE extends Statement {
//
class ST_NextCDE extends Statement {
public void Execute() {
Statement s1=new ST_NextC();
s1.Assign(this);
Statement s2=new ST_NextDE();
s2.Assign(this);
Statement s=(C<9) ? s1 : s2;
s.Execute();
Assign(s);
}
}
//
class ST_NextDE extends Statement {
public void Execute() {
Statement s1=new ST_NextD();
s1.Assign(this);
Statement s2=new ST_NextE();
s2.Assign(this);
Statement s=(D<9) ? s1 : s2;
s.Execute();
Assign(s);
}
}
//
class ST_NextD extends Statement {
public void Execute() {
C=1;
D++;
}
}
//
class ST_NextE extends Statement {
public void Execute() {
C=1;
D=1;
E++;
}
}
//
class ST_NextC extends Statement {
public void Execute() {
C++;
}
}
// 根据E计算A
private void CalculateA() {
A=(E*4)%10;
}
//
private void CalculateB() {
B=((D*4)%10+(E*4)/10)%10;
}
//
private void NextCDE() {
Statement s=new ST_NextCDE();
s.Assign(this);
s.Execute();
Assign(s);
}
// 验证ABCDE互不相等
private Statement Validate() {
CalculateA();
CalculateB();
Statement s1=new ST_PrintABCDE();
s1.Assign(this);
Statement s2=new ST_FindABCDE();
s2.Assign(this);
double X=(A*Math.pow(10,4)+B*Math.pow(10,3)+C*Math.pow(10,2)+D*10+E)*4;
double Y=(E*Math.pow(10,4)+D*Math.pow(10,3)+C*Math.pow(10,2)+B*10+A);
boolean b=(Math.round(X)==Math.round(Y));
return test.fn_IF(b,s1,s2);
};
//
public void Execute() {
NextCDE();
Validate().Execute();
}
}
// 模拟IF语句
static Statement fn_IF(boolean b, Statement s1, Statement s2) {
return b ? s1 : s2;
}
//
public void findABCDE() {
Statement s=new ST_FindABCDE();
s.E=1;
s.D=1;
s.C=0;
s.Execute();
}
//
public static void main(String a[]) {
new test().findABCDE();
}
}

后记:完成后发现比初想的复杂很多。

arong1234 2007-09-19
  • 打赏
  • 举报
回复
to coolFly19() ( )

这只是编程算法,不是实际实现,我估计绝大多数编译器都不会允许这样的递归
我们也不需要他能被实际编译通过,因为实际情况下绝对不会有楼主的限制

这个题目只是考你思维,不是让你写程序
arong1234 2007-09-19
  • 打赏
  • 举报
回复
如果大家一定要确保有无解退出的解,如下

template<int i>
int result()
{
return ((i>=10000 && i*4==(10000*(i%10) + 1000*((i/10)%10)) + 100*((i/100)%10))+10*((i/1000)%10)) + ((i/10000)%10)))?(i):(template sum<i-1>()));
}

#include <iostream>
using namespace std;
int main()
{
int iResult = result<30000>;
cout<< (iResult >= 10000)?(iResult):("no such number")) << endl;
}
xkw365 2007-09-19
  • 打赏
  • 举报
回复
<9的地方是否都得改成<10吧
中间件XL 2007-09-19
  • 打赏
  • 举报
回复
细看一下,arong1234()已经给出答案,简洁高效,学习了.
但都没解决无解退出递归的问题.
我的代码虽复杂,但设计上考虑到扩展.现在给出解决递归退出的代码.
import java.lang.Math;

public class test {
// 抽象语句类
abstract class Statement {
protected int A,B,C,D,E;
abstract void Execute();
public void Assign(Statement s) {
A=s.A;
B=s.B;
C=s.C;
D=s.D;
E=s.E;
}
}
// 空操作语句
class ST_NOP extends Statement {
public void Execute() {
System.out.print("NO SOLUSION!");
}
}
//
class ST_PrintABCDE extends Statement {
public void Execute() {
System.out.print(A);
System.out.print(B);
System.out.print(C);
System.out.print(D);
System.out.println(E);
}
}
//
class ST_FindABCDE extends Statement {
//
class ST_NextCDE extends Statement {
public void Execute() {
Statement s1=new ST_NextC();
s1.Assign(this);
Statement s2=new ST_NextDE();
s2.Assign(this);
Statement s=(C<9) ? s1 : s2;
s.Execute();
Assign(s);
}
}
//
class ST_NextDE extends Statement {
public void Execute() {
Statement s1=new ST_NextD();
s1.Assign(this);
Statement s2=new ST_NextE();
s2.Assign(this);
Statement s=(D<9) ? s1 : s2;
s.Execute();
Assign(s);
}
}
//
class ST_NextD extends Statement {
public void Execute() {
C=1;
D++;
}
}
//
class ST_NextE extends Statement {
public void Execute() {
C=1;
D=1;
E++;
}
}
//
class ST_NextC extends Statement {
public void Execute() {
C++;
}
}
//
private void NextCDE() {
Statement s=new ST_NextCDE();
s.Assign(this);
s.Execute();
Assign(s);
}
//
class ST_ValidABCDE extends Statement {
// 根据E计算A
private void CalculateA() {
A=(E*4)%10;
}
// 根据E,D计算B
private void CalculateB() {
B=((D*4)%10+(E*4)/10)%10;
}
//
public void Execute() {
CalculateA();
CalculateB();
Statement s1=new ST_PrintABCDE();
s1.Assign(this);
Statement s2=new ST_FindABCDE();
s2.Assign(this);
int X=(A*10000+B*1000+C*100+D*10+E)*4;
int Y=(E*10000+D*1000+C*100+B*10+A);
boolean b=(X==Y);
Statement s=test.fn_IF(b,s1,s2);
s.Execute();
}
}
// 验证ABCDE
private void Validate() {
Statement s1=new ST_NOP();
s1.Assign(this);
Statement s2=new ST_ValidABCDE();
s2.Assign(this);
boolean b=(E>9);
Statement s=test.fn_IF(b,s1,s2);
s.Execute();
};
//
public void Execute() {
NextCDE();
Validate();
}
}
// 模拟IF语句
static Statement fn_IF(boolean b, Statement s1, Statement s2) {
return b ? s1 : s2;
}
//
public void findABCDE() {
Statement s=new ST_FindABCDE();
s.E=1;
s.D=1;
s.C=0;
s.Execute();
}
//
public static void main(String a[]) {
new test().findABCDE();
}
}
jdk6.1测试 1.ABCDE*4=EDCBA
2.ABCDE*5=EDCBA
通过.

iwillalwaysloveyou 2007-09-18
  • 打赏
  • 举报
回复
zasu说的有道理
这符合我手工推理的时候的描述
我的main函数把
cout<< result<99999> << endl;

改成
cout<< result<29999> << endl;
即可
================================================
你改成21979更好
zhaoyue12365 2007-09-18
  • 打赏
  • 举报
回复
楼主说哪一题没有完全做对?
xkw365 2007-09-18
  • 打赏
  • 举报
回复
没有输入?
xkw365 2007-09-18
  • 打赏
  • 举报
回复
到现在还没有人完全作对呀^_^
coolFly19 2007-09-18
  • 打赏
  • 举报
回复
To arong1234() :

你用的什么编译器?我的是vs2003,cout<< result<99999> << endl;这行代码我是不能编译通过的,好像说什么递归函数太复杂,类似的我设成result<100>就好了,
isarc 2007-09-18
  • 打赏
  • 举报
回复
用心去算,让电脑失业。
arong1234 2007-09-18
  • 打赏
  • 举报
回复
zasu说的有道理
这符合我手工推理的时候的描述
我的main函数把
cout<< result<99999> << endl;

改成
cout<< result<29999> << endl;
即可
iwillalwaysloveyou 2007-09-18
  • 打赏
  • 举报
回复
int f()
{
return 21978;
}
xkw365 2007-09-17
  • 打赏
  • 举报
回复
还有人答吗?要不就结账了呵呵
iwillalwaysloveyou 2007-09-17
  • 打赏
  • 举报
回复
再说一遍,这种没有输入的题目,不适合用程序计算
zhhuajian 2007-09-17
  • 打赏
  • 举报
回复
看来我递归还真得好好学学
zasu06 2007-09-17
  • 打赏
  • 举报
回复
这里还有个问题,如果是有重复的或者是无结果呢 ? 怎么让递归终止?

freshui(五月的风 -最近老犯困)
strlen(srcNum)>5? return : (nop); //退出条件
这么退出好象不行, 因为return 语句无法这么使用
而其他人就是得出一个答案就不再继续
加载更多回复(45)
韩先超老师一直在一线工作,具备实战经验,课程内容均来自企业真实项目,课程覆盖大厂真实案例,讲解世界1000强企业实战课程,大家可以放心学习,学习课程之后即可在公司具体应用。 讲师简介高级运维、资深DevOps工程师、首席技术架构师;具备RHCE、RHCA、CKA、CKS等认证证书;参加过新一代云计算大,作为主讲嘉宾分享k8s如何助力企业转型、被北京日报发文专题报道;同时也对对中国移动、电信、咪咕视讯等企业做过线上k8s技术培训。 怎么学习kubernetes?K8S体系涉及到的技术众多,包括存储、网络、安全、监控、日志、DevOps、微服务、故障排查等,很多刚接触K8S的初学者,都感到无从下手 关于课程的一些疑问1、课程讲解的k8s版本是哪一个?K8s课程版本随着官方版本随时更新,针对不同版本k8s新增功能也同步更新。 2、需要自己做笔记吗?是否提供课程资料?课程提供完整的学习资料和文档,大家可以在我提供的资料基础上做一些标注修改即可,节省大家整理笔记时间 常见问题:问:k8s是最新版本吗答:是的,基于目前官方最新版本录制问:里面有实战项目吗?答:有实战项目,如go代码部署到k8s;tomcat服务部署到l8s;将公司代码迁移到K8s完整流程。 

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧