一个五位数字ABCDE*4=EDCBA,这五个数字不重复,请编程求出来.
2012-12-02 10:29
417 查看
一个五位数字ABCDE*4=EDCBA,这五个数字不重复,请编程求出来.
先给一个网友的纯的推理过程:
ABCDE*4=EDCBA
很显然,A不是1,就是2,为0就不是五位数,为> 2则乘积不会是五位数
因为4*E的个位数是A,则A=2
所以题目变成2BCDE*4=EDCB2
显然,E是8(原因,乘以4个位为2的只有3,8,而根据高位2*4> =8,它只能为8
所以变成2BCD8 * 4 = 8DCB2
既然BCD8*4没有进位,因此B只能是0,1,2
假设B=0,则CD8*4=DC02, 4*D的尾数必须为7,这肯定不可能
假设B=1,则1CD8*4 = DC12,4*D的个位数为8,D必然=7,因为1*4> 2
1C78*4=7C12 C*4 = 30+C-3, C=9,满足
假设B=2,则2CD8 * 4= DC22, D=8或者9,根据C等于4*D+3的个位,可以得出C等于5或者9
所以等式必须为2588 *4 或者2998*4,很显然都不满足
所以只能是(A,b,C,d,e)=(2,1,9,7,8)
下面给出一个遍历的C语言解法:
#include<stdio.h>
int calc()
{
int i;
for(i=20008;i<25000;i++)//A是2,E是8是很容易猜出来的
//从ABCDE*4=一个五位数可知,ABCDE<25000因为大于或等于25000的数乘以4是六位数
{
int right=0;
int left=i;
while(left!=0)
{
right=right*10+left;
left/=10;
}
if((i<<2)==right)//移位表翻倍
{
return i;
}
}
return -1;
}
void main()
{
printf("the result is :%d\n",calc());
}
如果要求:不准用for,while,if,switch语句????
只能用递归了。。。,这里给出一个递归的算法:
#include<stdio.h>
int result(int i)
{
int a,b,c,d,e;
int left,right;
a=i/10000;
b=(i/1000);
c=(i/100);
d=(i/10);
e=i;
right=e*10000+d*1000+c*100+b*10+a;
left=i*4;
return ((right==left&&a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e&&i>10000)?i:result(i-1));
}
void main(void)
{
int i=25000;
printf("the result is :%d\n",result(i));
}
先给一个网友的纯的推理过程:
ABCDE*4=EDCBA
很显然,A不是1,就是2,为0就不是五位数,为> 2则乘积不会是五位数
因为4*E的个位数是A,则A=2
所以题目变成2BCDE*4=EDCB2
显然,E是8(原因,乘以4个位为2的只有3,8,而根据高位2*4> =8,它只能为8
所以变成2BCD8 * 4 = 8DCB2
既然BCD8*4没有进位,因此B只能是0,1,2
假设B=0,则CD8*4=DC02, 4*D的尾数必须为7,这肯定不可能
假设B=1,则1CD8*4 = DC12,4*D的个位数为8,D必然=7,因为1*4> 2
1C78*4=7C12 C*4 = 30+C-3, C=9,满足
假设B=2,则2CD8 * 4= DC22, D=8或者9,根据C等于4*D+3的个位,可以得出C等于5或者9
所以等式必须为2588 *4 或者2998*4,很显然都不满足
所以只能是(A,b,C,d,e)=(2,1,9,7,8)
下面给出一个遍历的C语言解法:
#include<stdio.h>
int calc()
{
int i;
for(i=20008;i<25000;i++)//A是2,E是8是很容易猜出来的
//从ABCDE*4=一个五位数可知,ABCDE<25000因为大于或等于25000的数乘以4是六位数
{
int right=0;
int left=i;
while(left!=0)
{
right=right*10+left;
left/=10;
}
if((i<<2)==right)//移位表翻倍
{
return i;
}
}
return -1;
}
void main()
{
printf("the result is :%d\n",calc());
}
如果要求:不准用for,while,if,switch语句????
只能用递归了。。。,这里给出一个递归的算法:
#include<stdio.h>
int result(int i)
{
int a,b,c,d,e;
int left,right;
a=i/10000;
b=(i/1000);
c=(i/100);
d=(i/10);
e=i;
right=e*10000+d*1000+c*100+b*10+a;
left=i*4;
return ((right==left&&a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e&&i>10000)?i:result(i-1));
}
void main(void)
{
int i=25000;
printf("the result is :%d\n",result(i));
}
相关文章推荐
- 一道面试题,一个五位数字ABCDE*4=EDCBA,这个五个数字不重复,请问A,B,C,D,E分别是几?
- 一个五位数字ABCDE*4=EDCBA,这五个数字不重复,求出这个五位数字
- (转)一个五位数字ABCDE*4=EDCBA
- 一个数组arr,长度为N,N小于10^8,里面数字的范围是1~N,是否有重复,并统计出来
- 【C编程练习】2013华为校园招聘机试题目题5:将一个int类型的数字转化为字符串,并判断有无重复字符串(长度应大于2)有返回1,无返回2
- 有一个长度是101的数组,存在1~100的数字,有一个是重复的,找出重复出来
- 读入n个数,并把他存入一个数组,并且数字不能重复
- 猜数游戏,随机产生一个数字(1-100),自己看几次能出来,并且给出提示。
- 从1到100,每数到7的时候,把该数字提出来,剩下的数字继续循环,问最后剩下的一个数字是多少。
- 在进行C#编程时候,有的时候我们需要判断一个字符串是否是数字字符串,我们可以通过以下两种方法来实现。 【方法一】:使用 try{} catch{} 语句。 我们可以在try语句块中试图
- 判断一个整数中是否有重复数字(0~9),该数字不以0开头--------方法2
- 【编程题目】输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?打印出来
- 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符。
- 一个虚拟出来的编程空间
- (思科笔试)数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:
- 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432, 一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,
- 在一个整形数组中去掉重复的数字
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
- 假设数组中有一个数字出现的次数超过了数组长度的一半,试编程找出这个数字(消除 qosrt 快速排序 哈希)