整数1~9填入□□□□×□=□□□□,各数不重复,纠正以下代码
只改以下代码,保证思路不变,自己写的绕道,我有答案。
思路:先将两个4位数限定范围,分别用以上3个数拆成9个数,判断9个数均不为零且互不相等
- C/C++ code
#include<stdio.h>#define MAX 9876 //1~9组成的最大数四位数#define MIN 1234 //1~9组成的最小数四位数int main() { int i,j,k,a[9],*p=a,m,n; for(i=1;i<=9;i++) { for(j=MIN;j<=MAX/i;j++) { k=i*j; *p=j/1000;*(p+1)=j/100%10;*(p+2)=j/10%10;*(p+3)=j%10; *(p+4)=i; *(p+5)=k/1000;*(p+6)=k/100%10;*(p+7)=k/10%10;*(p+8)=k%10; /*以下为前面数与其后所有数比较*/ for(m=0;m<8&&a[m]!=0;m++) { for(n=m+1;n<9&&a[n]!=0;n++) { if(a[m]==a[n]) continue; } } printf("%d×%d=%d\n",j,i,k); } }}[解决办法]
- C/C++ code
#define MAX 9876 //1~9组成的最大数四位数#define MIN 1234 //1~9组成的最小数四位数int main() { bool bFind; int i,j,k,a[9],*p=a,m,n; for(i=1;i<=9;i++) { for(j=MIN;j<=MAX/i;j++) { k=i*j; *p=j/1000;*(p+1)=j/100%10;*(p+2)=j/10%10;*(p+3)=j%10; *(p+4)=i; *(p+5)=k/1000;*(p+6)=k/100%10;*(p+7)=k/10%10;*(p+8)=k%10; /*以下为前面数与其后所有数比较*/ bFind = true; for(m=0;m<8;m++) { for(n=m+1;n<9;n++) { if(a[m]==a[n]||a[m]==0||a[n]==0) { bFind = false; break; // continue; } } if(!bFind) break; } if(bFind) printf("%d×%d=%d\n",j,i,k); } }}
[解决办法]
9个数的全排列
[解决办法]
明白了,楼上的代码中,1-9每个数字对应一个素数1对应于3,2对应于5等,,素数2弃之不用。如果各个数字个出现一次,其对应的素数的乘积就是从素数第3个素数到第10个素数的乘积。
[解决办法]
[解决办法]
按照你的思路来写这个程序,实际上不需要先拆数字再找重复,完全可以在拆解的同时进行判定:
- C/C++ code
#include<stdio.h>#define MAX 9876#define MIN 1234int main() { int i,j,k,a[10]={1},m,n,found; for(i=1;i<9;i++) { for(j=MIN;j<=MAX/i;j++) { for (n=1;n<10;++n) a[n]=0; found=0; a[i]=1; /* 数字i已有 */ m=j; while ((!(found+=a[m%10]++))&&(m=m/10)); /* 检查j里是否有重复或0 */ m=k=j*i; while ((!(found+=a[m%10]++))&&(m=m/10)); /* 检查k里是否有重复或0 */ if (found==0) printf("%d×%d=%d\n",j,i,k); } }}