读书人

整数1~9填入□□□□amp;#215;□=□□□

发布时间: 2012-05-20 16:03:12 作者: rapoo

整数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个素数的乘积。
[解决办法]
探讨

8#的代码调试过吗?光这一句就有问题
int multiOK =3*5*7*11*13*17*19*23*29;
这个数是3234846615,超过了整数的最大范围2^31-1.

[解决办法]
按照你的思路来写这个程序,实际上不需要先拆数字再找重复,完全可以在拆解的同时进行判定:
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);        }    }} 

读书人网 >C语言

热点推荐