2

假设字符 a,b,c,d,e 代表数字 1 到 9,它们之间不能相等。

问题:

能满足多少平等(ab * cde = adb * ce)。示例: 36 * 495 = 396 * 45

这是我的代码,结果是正确的。但是,我认为我的代码太笨拙了,尤其是在(if(a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e&&c*d*e!=0))

如果有人能给我一个更好的解决方案,我将不胜感激。

#include<stdio.h>
main(){
    int a,b,c,d,e,m,n,i=0;
    long f1,f2,f3,f4;
    for(m=11;m<=99;m++){
        a=m/10;
        b=m%10;
        if(a!=b&&a*b!=0) 
        {
            for(n=101;n<=999;n++)
            {
                c=n/100;
                d=n%100/10;
                e=n%10;
                if(a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e&&c*d*e!=0)
                {
                    f1=a*10+b;
                    f2=c*100+d*10+e;
                    f3=a*100+d*10+b;
                    f4=c*10+e;
                    if(f1*f2==f3*f4) i++;
                    printf("\n%d%d*%d%d%d*=%d%d%d*%d%d\n",a,b,c,d,e,a,d,b,c,e);
                }
            }
        }
    }
    printf("%d\n",i);
    return 0;
}
4

2 回答 2

2

如果可以的话,而不是

int a,b,c,d,e;

尝试使用

int numbers[5];

然后检查你的数字是否都不同,你可以使用 for 循环

doubleOccurence = FALSE; /* where FALSE = 0 */
for (i=0; i < 4; i++) {
    for (j=i+1; j < 5; j++) {
        doubleOccurence = doubleOccurence || (numbers[i] == numbers[j]);
    }
}

对我来说它看起来更清晰一些。

于 2013-10-24T07:58:22.707 回答
2

不幸的是,您无法真正遍历变量列表,最好使用 Julien 在他的回答中提到的一系列数字。

int nums[5];

用 nums[0] 替换 a,用 nums[1] 替换 b,等等......

但后来我会更进一步整理你的代码并调用一个函数来检查数组的唯一性:

if(listIsUnique(nums, 5)) // yes hardcoded the 5, but that can be sorted
{
    ...
}

接着:

bool listIsUnique(int* nums, int len)
{
    for (int i = 0; i < len; i++)
        for (int j = i + 1; j < len; j++)
            if (nums[i] == nums[j])
                return false; // return false as soon as you find a match - slightly faster :)

    return true; // if we get here its a unique list :)
}

注意:代码未经测试,可能有错误:o

于 2013-10-24T08:16:11.397 回答