由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成
比如:
210*6=1260
8*473=3764
27*81=2187都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足?
#includeint issame(int a,int b,int c ,int d){ if(a == b || a == c || a == d) return 1; if(b == c || b == d || c == d) return 1; return 0;}int isdivided(int t,int a,int b,int c,int d){ int a1,b1,c1,d1; int mark = 0; //取位数 a1 = t%10; t /= 10; b1 = t%10; t /= 10; c1 = t%10; d1 = t/10; if(!issame(a1,b1,c1,d1)) { if(a1 == a || a1 == b || a1 == c || a1 == d) mark ++; if(b1 == a || b1 == b || b1 == c || b1 == d) mark ++; if(c1 == a || c1 == b || c1 == c || c1 == d) mark ++; if(d1 == a || d1 == b || d1 == c || d1 == d) mark ++; if(mark == 4) return 1; } return 0;}int main(){ int count = 0; int a,b,c,d,t; //a*bcd型 for(a=2;a<=9;a++) for(b=1;b<=9;b++) for(c=0;c<=9;c++) for(d=0;d<=9;d++) { if(!issame(a,b,c,d))//4个数字各不相同 { t = a*(100*b+10*c+d); if(t/1000 > 0 && isdivided(t,a,b,c,d))//首先要是4位数,判断乘积 是否由这4个数字组成 { printf("%d*%d=%d\n",a,t/a,t) ; count ++; } } } //ab*cd型(ab a && c <=9否则a自加1后,因不满足条件而跳出循环,导致最终的a=1999就停止搜索 for(d=0;d<=9;d++) { //printf("find%d%d%d%d\n",a,b,c,d); if(c > a && !issame(a,b,c,d)) //c>a应该写在此处 { t = (10*a + b)*(10*c + d); if(t/1000 > 0 && isdivided(t,a,b,c,d)) { printf("%d*%d=%d\n",10*a+b,10*c+d,t); count ++; } } } printf("共计:%d\n",count); return 0;}