我的C代码太尴尬了

时间:2013-10-24 07:45:31

标签: c

假设字符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;
}

2 个答案:

答案 0 :(得分: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]);
    }
}

我看起来更清楚。

答案 1 :(得分:2)

不幸的是,你不能真正迭代一个变量列表,你可以通过他的答案中的Julien提及的一系列数字来改善你。

int nums[5];

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

但接下来我会更进一步整理代码并调用一个函数来接收数组以检查唯一性:

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

相关问题