题目
美国数学家维纳(N.Wiener)智力早熟,11 岁就上了大学。他曾在 1935~1936 年应 邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是 有人询问他的年龄,他回答说:“我年龄的立方是个 4 位数。我年龄的 4 次方是个 6 位数。这 10 个数字正好包含了从 0 到 9 这 10 个数字,每个都恰好出现 1 次。” 请你推算一下,他当时到底有多年轻。
解决方案:flag标记法
空间复杂度:20
时间复杂度:o(n)
首先对题目进行分析:年龄的立方是4位数,可以确定扫描的下限是11
之后便是通过简单的定性,确定满足条件的数,将数的每一位放进一个数组之中,最后将数组进行遍历,确定flag值,如果只出现一次就是1,数组遍历9次即可,9次都是1的就是满足条件的数.`
#include <stdio.h>
#define false 0
#define ture 1
int flag[10];
int r[10];
/***********************************************************************************
* 函 数:int test(const int *ar)
* 功 能:将r[10]进行遍历,并记录flag值,通过flag值来判断是不是目标值
* 参 数:一维数组指针
* 返 回 值:正确 1 错误0
* 说 明:本函数时间复杂度为20 空间复杂度为20
************************************************************************************/
int test( const int *ar){
for(int i=0;i<10;i++)
{
flag[ar[i]]+=1;
}
int i=0;
for( i=0;i<9;i++) //对flag进行遍历,如果每次数字都出现了一次,则能遍历到最后一个棋子,i=9
{
if(flag[i]!=1)
break;
}
if(i!=9)
return false;
else
return ture;
}
/***********************************************************************************
* 函 数:void main()
* 功 能:主函数
* 参 数:无
* 返 回 值:0
* 说 明:本函数时间复杂度为n
************************************************************************************/
int main()
{
int i,j,a,b;
for(i=11;i<100;i++)
{
a=i*i*i;
if( (a/1000)>=1&&(a/10000)==0)//对数字位数进行判断
{
b=a*i;
if((b/100000)>=1&&(b/1000000)==0)//同理
{
//将a和b按位存入r[10]中
for(j=0;j<4;j++)
{
r[j]=a%10;
a=a/10;
}
for(j=4;j<10;j++)
{
r[j]=b%10;
b=b/10;
}
if (test(r))//根据返回值判断是否是所求数据
{
printf("%d",i);
break;
}
else
continue;
}
else
continue;
}
else
continue;
}
return 0;
}