社区
C++ 语言
帖子详情
华为面试题,改了一下,你会吗?^_^
xkw365
2007-09-13 08:50:55
一个五位数字ABCDE*4=EDCBA,这五个数字不重复,请编程求出来.要求:不准用for,while,if,switch语句
...全文
2132
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)
华为
笔试
面试题
lz的呢,是一个常量字符串。6、X.25作为国际通用标准的广域网协议,内置的差错纠正,流量控制和丢包重传机制使之具有高度的可靠性,由于数据吞吐率很低,包时延较大,故不适于在质量差的信道上传输数据,这种说法正确吗?大意如下:公司职员知道老板的年龄,不知道他女儿的年龄,老板3个女儿的年龄相加为13,相乘为老板年龄,且只有一个女儿的年龄大于5岁,求这4个的年龄?一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起, 给出一个age, 在些链表中删除学生年龄等于age的学生信息。
不要小看简单题-
华为
面试题
库简单题一题多解整理
写在前面
华为
面试题
库刷题第二次整理,这次整理的都是简单题的多解法,大部分都是用了巧妙方法使空间复杂度位O(1),简单题也有它的魅力和价值。 个人博客的链接:flamsteed 136. 只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 解法:要求时...
200 道算法
面试题
集锦!Python 实现,含
华为
、BAT 等校招真题!
点击上方“AI有道”,选择“置顶”公众号重磅干货,第一时间送达春招临近,无论是要找工作的准毕业生,还是身在职场想要提升自己的程序员,提升自己的算法内功心法、提升Pyth...
华为
面试题
整理
华为
面试题
整理 **只出现一次的数字 ** 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 解法:要求时间复杂度O(N),空间复杂度O(1) 满足上述要求的解法,目前只有位运算法: 根据位运算异或的性质,可以得到以下的规律: a ^ 0 = a; a ^ a = 0; a ^ b ^ c = a ^ c ^ b; class Solution { public: int
华为
机试题python版_200 道算法
面试题
集锦!Python 实现,含
华为
、BAT 等校招真题!...
200 道算法
面试题
集锦!Python 实现,含
华为
、BAT 等校招真题!点击上方“AI有道”,选择“置顶”公众号重磅干货,第一时间送达春招临近,无论是要找工作的准毕业生,还是身在职场想要提升自己的程序员,提升自己的算法内功心法、提升Python编程能力,总是大有裨益的。今天,红色石头发现了一份好资源:Python实现的
面试题
集锦!这份资源名为:Interview-code-practice...
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章