社区
C++ 语言
帖子详情
华为面试题,改了一下,你会吗?^_^
xkw365
2007-09-13 08:50:55
一个五位数字ABCDE*4=EDCBA,这五个数字不重复,请编程求出来.要求:不准用for,while,if,switch语句
...全文
2084
65
打赏
收藏
华为面试题,改了一下,你会吗?^_^
一个五位数字ABCDE*4=EDCBA,这五个数字不重复,请编程求出来.要求:不准用for,while,if,switch语句
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
C++ 语言
65,209
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章