见过一道小学奥数题,记得题目是:从5月1日到7月1日数字0-9无重复的时间有多少个?(如0512142804是05月12日14:28:04,其中0、1、4有重复, 0526174839无重复)。
大概是迎春杯华杯走美杯之一的考题吧,用到排列组合,想半天也不会做,其实我多数题都不会做,但确实有不少小学生能考很高的分数,他们也对奥数题很感兴趣,跟玩似的,不服不行,下棋我也惨败过幼儿园小朋友。
用C语言编程直接穷举找到答案是204个。程序如下:
#include
#include
void main()
{ char a[11];
int p[10],i,c=0;
longt,t1=1398873600,t2=1404143999;
struct tm *l;
for(t=t1;t<=t2;t++){
l=localtime(&t);
sprintf(a,"%0.2d%0.2d%0.2d%0.2d%0.2d",l->tm_mon+1,l->tm_mday,l->tm_hour,l->tm_min,l->tm_sec);
for(i=0;i<=9;i++)
p[i]=0;
for(i=0;i<=9;i++){
p[a[i]-48]=p[a[i]-48]+1;
}
if(p[0]==1&&p[1]==1&&p[2]==1&&p[3]==1&&p[4]==1&&p[5]==1&&p[6]==1&&p[7]==1&&p[8]==1&&p[9]==1)
printf("%d,%s\n",c++,a);
}
}
程序中用到了时间函数,数组p用来检测重复。运行结果如下:
0, 0526173849
1, 0526173948
2, 0526174839
……
47, 0529184736
48, 0617234859
49, 0617234958
……
201, 0629185437
202, 0629185734
203, 0629185743
另外一道相似的题目,出处未知,是列举0-9组成加法式子,程序如下:
#include "stdafx.h"
int fj(int a,int b,int c)
{int f[10],i;
for(i=0;i<=9;i++)f[i]=0;
while(a)
{if(f[a%10])
return0;
else
f[a%10]=1;
a/=10;
}
while(b)
{if(f[b%10])
return0;
else
f[b%10]=1;
b/=10;
}
while(c)
{if(f[c%10])
return0;
else
f[c%10]=1;
c/=10;
}
return 1;
}
void main()
{int x,y,z,j=1,s=0;
for(x=12;x<=98;x++)
for(y=1023;y<=9876;y++)
{z=x+y;
if(fj(x,y,z))
{printf("%d+%d=%d ",x,y,z);++s;
if(!(j%6))printf("\n");j++;
}
}
for(x=102;x<=987;x++)
for(y=102;y<=987;y++)
{z=x+y;
if(z>1023&&fj(x,y,z))
{printf("%d+%d=%d ",x,y,z);++s;
if(!(j%6))printf("\n");j++;
}
}
printf("\n%d\n",s);
}
运行结果:
26+4987=5013 27+4986=5013 34+5978=6012 34+5987=6021 37+5984=6021 38+5974=6012
……
859+347=1206 859+743=1602 874+629=1503 876+429=1305 879+426=1305 879+624=1503
共132个。
转载本文请联系原作者获取授权,同时请注明本文来自康建科学网博客。
收藏
分享
分享到: