历届试题 神奇算式 (全排列)

    xiaoxiao2021-03-25  54

    由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。

    比如:

    210 x 6 = 1260 8 x 473 = 3784 27 x 81 = 2187

    都符合要求。

    如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。

    请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。

    思路:

       进型全排列,判断重复

    代码:

    #include<iostream> #include<string.h> #include<algorithm> using namespace std; int a[10] = {0,1,2,3,4,5,6,7,8,9}; int check(int s) //判断是否相等 { int t[4],i,j,v[4]={0}; t[0] = s/1000; t[1] = s/100; t[2] = s/10; t[3] = s; for (i=0; i<3; i++) for (j=i+1; j<4 ;j++) { if (t[i] == t[j]) return 0; } for (i=0; i<4; i++) { for (j=0; j<4; j++) { if (a[i] == t[j]) { v[j]++; if (v[j]>1) { return 0; } } } } if (v[0]+v[1]+v[2]+v[3] != 4) return 0; return 1; } int main() { int i,j,s[2],cnt=0,cnt1=0,t[4]={0},t1[4]={0}; do { if (a[0] != 0 && a[1] != 0 && (t[0]!=a[0] || t[1]!=a[1] || t[2]!=a[2] || t[3]!=a[3])) //打头的不能为0,排列数不能和上次相同 { s[0] = a[0] * (a[1]*100+a[2]*10+a[3]); if (s[0]>=1000&&s[0]<=9999) { if (check(s[0])) { cnt++; for (i=0; i<4; i++) t[i] = a[i]; printf("%d=%d*%d%d%d\n",s[1],a[0],a[1],a[2],a[3]); } } } if (a[0] != 0 && a[2] != 0 && (t1[0]!=a[0] || t1[1]!=a[1] || t1[2]!=a[2] || t1[3]!=a[3])) { s[1] = (a[0]*10+a[1]) * (a[2]*10+a[3]); if (s[1]>=1000&&s[1]<=9999) { if (check(s[1])) { cnt1++; printf("%d=%d%d*%d%d\n",s[1],a[0],a[1],a[2],a[3]); for (i=0; i<4; i++) t1[i] = a[i]; } } } }while (next_permutation(a,a+10)); cout<<cnt+(cnt1/2);//两个乘两个的时候有出现交换情况,除以2 return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-37997.html

    最新回复(0)