首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求解:华为一道面试题,该怎么处理

2012-03-31 
求解:华为一道面试题一个五位数字ABCDE*4EDCBA,这五个数字不重复,请编程求出来,谢谢!希望有代码,我不知道

求解:华为一道面试题
一个五位数字ABCDE*4=EDCBA,这五个数字不重复,请编程求出来,谢谢!希望有代码,我不知道如何下笔!

[解决办法]
(A*10000+B*1000+C*100+D*10+E)*4=E*1000+D*1000+C*100+B*10+A


用循环不久能求出来了
[解决办法]
推理如下:
因为结果还是5位,所以A小于或等于2.
因为E*4的结果不可能是奇数,所以A不等于1,A=2.
因为A等于2,只有E等于8的条件下才满足E×4=X2同时大于等于8.
因为E=8,所以B等于小于2。
如果B=2,4×8=32,D×4的结果必须是个位等于9,条件不成立,所以B=1.
因为B=1,所以D只能是2或7(D与4的乘积满足X8)。
剩下两个结果很容易就推算出来了。

21978
[解决办法]
int main()
{
int a,b,c,d,e;
for(a=0;a <10;a++)
for(b=0;b <10;b++)
for(c=0;c <10;c++)
for(d=0;d <10;d++)
for(e=0;e <10;e++)
{
if((a*10000+b*1000+c*100+d*10+e)*4==(e*10000+d*1000+c*100+b*10+a))
cout < <(a*10000+b*1000+c*100+d*10+e) < < "*4== " < <e*10000+d*1000+c*100+b*10+a < <endl;

}

system( "pause ");
return 0;
}
[解决办法]
21978
#define foor(x) for(int x=0;x <10;++x)

int main(int , char* [])
{
foor( A ){
foor( B ){
foor( C ){
foor( D ){
foor( E ){
if( (A*10000+B*1000+C*100+D*10+E)*4==E*10000+D*1000+C*100+B*10+A )
printf( "%d%d%d%d%d\n ",A,B,C,D,E);

}
}
}
}
}
return 0;
};
[解决办法]
一个五位数字ABCDE*4=EDCBA,这五个数字不重复,请编程求出来,谢谢!希望有代码,我不知道如何下笔!
~~~~~~~~~~~
由A*4+进位= E,并且E*4个位是A
--> A=1,2时,乘以4不溢出;E*4的个位必定是偶数
--> A=2;E*4个位是2
--> E=8
--> 由8*4=32
--> D*4+3的个位数字是B;C*4+进位=C;B*4+进位=D,不能产生进位
--> B=0,1,2;D*4+3只能产生个位数字为奇数
--> B=1
--> D=2,7;1*4+进位=D,不能产生进位
--> D=7
--> C*4+3=3C,其中个位是C,并且产生进位3
--> C=9
所以是21978
[解决办法]
有怎么麻烦么?

A 只能等于2,这个可以一眼看出来,因为只有 1,或者2 * 4 才小于10;
但由于 A 又要等于E * 4的个位,A则肯定是个偶数.这样 得到 E = 8;

这样就只就得到2BCD8 只要判断3个~~~~~~

[解决办法]
稍改一下
int main(void)
{
int a,b,c,d,e;
for(a=1;a <10;a++)
for(b=0;b!=a&&b <10;b++)
for(c=0;c!=a&&c!=b&&c <10;c++)
for(d=0;d!=a&&d!=b&&d!=c&&d <10;d++)
for(e=1;e!=a&&e!=b&&e!=c&&e!=d&&e <10;e++)
{
if((a*10000+b*1000+c*100+d*10+e)*4==(e*10000+d*1000+c*100+b*10+a))
cout < <(a*10000+b*1000+c*100+d*10+e) < < "*4== " < <e*10000+d*1000+c*100+b*10+a < <endl;

}

system( "pause ");
return 0;
}

[解决办法]
既然是编程题目,推理结果就没有意,借用楼上的,修正一下:



#define foor(x) for(int x=0;x <10;++x)

int main(int , char* [])
{
foor( A ){
foor( B ){
foor( C ){
foor( D ){
foor( E ){

if(A==B || B==C || C==D || D==E) continue;
if(E*10000+D*1000+C*100+B*10+A == (A*10000+B*1000+C*100+D*10+E) < <2)
printf( "%d%d%d%d%d\n ",A,B,C,D,E);

}
}
}
}
}
return 0;
};
[解决办法]
LS需要改成:

if(A==B || A==C || A==D || A==E || B==C || B==D || B==E || C==D || C==E || D==E)
continue;
[解决办法]
/*c++代码*/
#include <iostream.h>
#include <stdlib.h>
#define M 10 /*M取10、8、16等对应相应的进制 */
int main()
{
int a,b,c,d,e;
for(a=1;a <M;a++)
for(b=0;b!=a&&b <M;b++)
for(c=0;c!=a&&c!=b&&c <M;c++)
for(d=0;d!=a&&d!=b&&d!=c&&d <M;d++)
for(e=1;e!=a&&e!=b&&e!=c&&e!=d&&e <M;e++)
{
if((a*M*M*M*M+b*M*M*M+c*M*M+d*M+e)*4==(e*M*M*M*M+d*M*M*M+c*M*M+b*M+a))
cout < <(a*M*M*M*M+b*M*M*M+c*M*M+d*M+e) < < "*4== " < <e*M*M*M*M+d*M*M*M+c*M*M+b*M+a < <endl;

}

system( "pause ");
return 0;
}

[解决办法]
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int i,a,b,c,d,e;
for(i=10000;i <25000;i++)
{
a=i/10000;
b=i/1000%10;
c=i/100%10%10;
d=i/10%10%10%10;
e=i%10;
if(a!=b&&a!=c&&a!=d&&a!=e)
if(b!=c&&b!=d&&b!=e)
if(c!=d&&c!=e&&d!=e)
if((a*10000+b*1000+c*100+d*10+e)*4==e*10000+d*1000+c*100+b*10+a)
cout < <i < <endl;
}
system( "pause ");
return 0;
}
[解决办法]
写了求A,E:
有人接着写
#include <iostream>
#include <cstdlib>

using namespace std;
//ABCDE*4=EDCBA
int main(){
int A,B,C,D,E;
//for A
for (int i=2; i <10; i+=2){
if ((4*i) > = 10) continue;
for (int j=0; j <10; j++)
if (i == (4*j)%10){A=i;}
}

//for E
E = 4*A;
//for D
//continue;

return 0;
}

[解决办法]
#include <stdio.h>
int main(void)
{
//int n_1[] ={0,1,2,3,4,5,6,7,8,9};
int i,j,k,m,n;
int a,b,c,d,e;
int result1,result2;
for(i=0;i <10;i++){
a=i;
for(j=0;j <10;j++){
b=j;
if(b==a) continue;
for(k=0;k <10;k++){
c=k;
if(c==a || c==b) continue;
for(m=0;m <10;m++){
d=m;
if(d==a || d==b || d==c) continue;
for(n=0;n <10;n++){
e=n;
if(e==a || e==b || e==c || e==d) continue;
result1=a+b*10+c*100+d*1000+e*10000;
result2=(e+d*10+c*100+b*1000+a*10000)*4;
if(result1==result2)


goto FIND;
}
}
}
}
}
printf( "not find a=%d,b=%d,c%d,d=%d,e=%d \n ",a,b,c,d,e);
return -1;
FIND:
printf( "find a=%d,b=%d,c%d,d=%d,e=%d \n ",a,b,c,d,e);
return 0;
}

//result 21978
[解决办法]
推理的话如下:
/**************
* abcde*4=edcba
* 1) a <3 if a=3 a*4> 10,so a=0,1,2
* 2) 0-9 *4 =0,2,4,6,8
* 3) a=0,2
* 4) a!=0,so a=2
*
* 5) 2bcde*4=edcb2
* 6) 3,8 *4 =?2 so e=3,8
* 7) 2*4=8> 3 so e=8
*
* 8) 2bcd8*4=8dcb2
* 9) b <3 if b> 3 3*4> 12 so b=0,1,2
*10) b!=0 && b!=2 so b=1
*
*11) 21cd8*4=8dc12
*12) 3+8=11 so d=2,7
*13) d!=2 so d=7
*
*14) 21c78*4=87c12
*15) 7-1*4=3 ,so need carry 3
*16) 8,9*4=3? so c=8,9
*17) c!=8 so c=9
*
*18) 21978*4=87912
***************/
[解决办法]
枚举法,要比人脑推理快好多。

#include <stdio.h>
#include <time.h>

#define SYM_NUM 10
#define GEN_NUM 5

char sym[SYM_NUM]={0,1,2,3,4,5,6,7,8,9};
char flag[SYM_NUM];
int status[GEN_NUM];


inline bool GetNextSym( )//生成下一个互不重复的五位数字
{
bool noclear=false;
int carry =1;
for( int i=0; i <GEN_NUM; i++ )
{
if( carry+status[i] > = SYM_NUM )
{
if( !noclear )
{
flag[status[i]]=0;
}else
{
noclear=false;
}
status[i]=0;
carry = 1;
}else
{
if( !noclear )
{
flag[status[i]]=0;
}else
{
noclear=false;
}
status[i]+=carry;
carry = 0;
for( ; i> =0; i-- )
{
if( !flag[status[i]] )
{
flag[status[i]]=1;
}else
{
carry = 1;
--i;
noclear=true;
break;
}
}
if( !noclear )
{
break;
}
}
}
if( carry == 1 )
{
return false;
}
return true;
}

inline void SetInitialStatus()
{
if( GEN_NUM > SYM_NUM ){throw;}
status[GEN_NUM-1]=1;
flag[1]=1;
status[GEN_NUM-2]=0;
flag[0]=1;
status[GEN_NUM-3]=2;
flag[2]=1;
for(size_t i=GEN_NUM-4; i <GEN_NUM; --i )
{
status[i]=status[i+1]+1;
flag[ status[i] ]=1;
}
}

int main()
{
char cur[GEN_NUM];
clock_t bg,ed;
SetInitialStatus();
bg=clock();
do
{
int l=0,r=0;
for( int i=0; i <GEN_NUM; i++ )
{
r=10*r+sym[ status[GEN_NUM-i-1]];
l=10*l+sym[ status[i] ];
cur[GEN_NUM-i-1]=sym[status[i]];
}
if( l*4==r )
{
fprintf(stdout, "%d %d\n ",l,r);
}
}while(GetNextSym());
ed=clock();
fprintf(stdout, "Time:%f\n ", (double)(ed-bg)/CLOCKS_PER_SEC);
return 0;
}

[解决办法]
如果结合推理写程序也许要快一些
在CB中运行后得到结果:21978
//---------------------------------------

#pragma hdrstop

//---------------------------------------

#pragma argsused
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
int A = 2, B, C, D, E = 8;


long int temp1, temp2;

for(B = 0; B <= 9; B++)
{
if((B != A) && (B != E))
{
for(C = 0; C <= 9; C++)
{
if((C != A) && (C != B) && (C != E))
{
for(D = 0; D <= 9; D++)
{
if((D != A) && (D != B) && (D != C) && (D != E))
{
temp1 = A * 10000 + B * 1000 + C * 100 + D * 10 + E;
temp2 = E * 10000 + D * 1000 + C * 100 + B * 10 + A;
if((temp1 * 4) == temp2)
cout < < temp1 < < endl;
}
}
}
}
}

}
system( "pause ");

return 0;
}
//---------------------------------------

[解决办法]
#include <iostream>
#include <cstdlib>
using namespace std;

const long int M = 0x10;/*M取10、8、16等对应相应的进制 */

int main()
{
long int a,b,c,d,e;
for(a=0;a <M;a++)
for(b=0;b <M;b++)
for(c=0;c <M;c++)
for(d=0;d <M;d++)
for(e=0;e <M;e++)
{ if((a*M*M*M*M+b*M*M*M+c*M*M+d*M+e)*4== (e*M*M*M*M+d*M*M*M+c*M*M+b*M+a))
{ cout < <(a*M*M*M*M+b*M*M*M+c*M*M+d*M+e) < < "*4== " < <e*M*M*M*M+d*M*M*M+c*M*M+b*M+a < <endl;

if (a==b||a==c||a==d||a==e||b==c||b==d||b==e||c==d||c==e||d==e}
{ cout < < "a= " < <a < <endl; cout < < "b= " < <b < <endl; cout < < "c= " < <c < <endl; cout < < "d= " < <d < <endl; cout < < "e= " < <e < <endl; continue; }
}

}

system( "pause ");
return 0;
}


昨天试了一下:
十六进制 :无解
0*4==0
a= 0
b= 0
c= 0
d= 0
e= 0
请按任意键继续. . .
十进制 :21978
0*4==0
a= 0
b= 0
c= 0
d= 0
e= 0
21978*4==87912
请按任意键继续. . .

八进制 :无解
0*4==0
a= 0
b= 0
c= 0
d= 0
e= 0
336*4==1344
a= 0
b= 0
c= 5
d= 2
e= 0
2730*4==10920
a= 0
b= 5
c= 2
d= 5
e= 2
3066*4==12264
a= 0
b= 5
c= 7
d= 7
e= 2
请按任意键继续. . .

[解决办法]
#include <iostream>
using namespace std;
int main()
{
cout < < "start -- " < < endl;
int num;
int temp;
int tempi;

for (int i = 12345; i <= 99999; ++i)
{
num = 0;
temp = 100000;
tempi = i;

for (int k = 0;k < 5; ++k)
{
temp = temp/10;
num = num + (tempi%10)*temp;
tempi = tempi/10;

}
if (i%1000 == 0) cout < < "GO == " < < i < < " ----- " < < num < < endl;
if (i*4 == num) break;
}
cout < < num < < "-- END!! " < < endl;
}


哈哈, 就是这样啦. 看上面有位兄弟搞了5,6个循环头都大了!!
[解决办法]
试一下,这程序代码也可,呵呵

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{ char s[6]={ '0 '};
for(int i=0;i <=99999;i++)
{ int b;
sprintf_s(s,6, "%d ",i);
    if ((s[0]==s[1])||(s[0]==s[2])||(s[0]==s[3])||(s[0]==s[4])||(s[1]==s[2])||(s[1]==s[3])||(s[1]==s[4])||
(s[2]==s[3])||(s[2]==s[4])||(s[3]==s[4])) //晕,这儿太长了
{
continue;
}
else
{
  b=s[0];
s[0]=s[4];
s[4]=b;
b=s[1];
  s[1]=s[3];
s[3]=b;
b=atoi(s);
if (4*i==b)
cout < < "答案: " < <i < < "*4= " < <b < <endl;
}
}
return 0;

}



[解决办法]
这么多算法啊.我也有个算法,想法很简单,累加,符合条件输出

#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int const Begin_num=10234;//最小的不相等的5位数
int const End_num=24986; //最大的不相等的5位数
int current_num=Begin_num;
int a,b,c,d,e;
for (current_num;current_num <=End_num;current_num+=2)
{
a=current_num/10000;
b=(current_num%10000)/1000;
c=(current_num%1000)/100;
d=(current_num%100)/10;
e=current_num%10; //算出来各位数字
if ((current_num*4==(e*10000+d*1000+c*100+b*10+a))&&
(a!=b)&&(a!=c)&&(a!=d)&&(a!=e)&&(b!=c)&&(b!=d)&&(b!=e)&&(c!=d)&&(c!=e)&&(d!=e))
{
cout < <a < <b < <c < <d < <e < <endl;
cout < < "That 's the number you want " < <endl;
}
}
getch();
}

热点排行
Bad Request.