欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《算法竞赛入门经典(第2版)》习题2-6排列

程序员文章站 2024-03-18 23:51:28
...

习题2-6 排列(permutation)

#include <stdio.h>
#include <math.h>
int main()//可以用很多方法做,排列是最好的,不过局限于本章范围局限于判断和循环才这样做,为啥用倍数不用除数是为了避免浮点计算
{   int t=0;
    for(int i=1;i<=9;i++)
    {
        for(int j=1;j<=9;j++)
        {
            for(int k=1;k<=9;k++)
            {t=k+j*10+i*100;
                if(k!=j&&k!=i&&i!=j&&t*2<=999&&t*3<=999)//确定该三位数个十百位互不相等且它的3倍和2倍在区间内,尽量减小运算次数
                {int a=2*t;int b=(a%100-a%10)/10;int c=(a-b*10-a%10)/100;//确定第一个整数的十位百位
                    if(a%10!=i&&a%10!=j&&a%10!=k&&a%10!=0&&b!=i&&b!=j&&b!=k&&b!=0&&c!=i&&c!=j&&c!=k&&a%10!=b&&a%10!=c&&b!=c)//三位数的两倍的三位互不相等且个位十位不为0,三位两倍和三位的各位互不相等
                    {int d=3*t;int e=(d%100-d%10)/10;int f=(d-e*10-d%10)/100;//提取三倍的十位百位
                        if(d%10!=i&&d%10!=j&&d%10!=k&&d%10!=0&&e!=i&&e!=j&&e!=k&&e!=0&&f!=i&&f!=j&&f!=k&&d%10!=e&&d%10!=f&&e!=f)//条件同上
                        {
                            if(d%10!=a%10&&d%10!=b&&d%10!=c&&e!=a%10&&e!=b&&e!=c&&f!=a%10&&f!=b&&f!=c)//二倍和三倍的各位不相同
                            {printf("%d %d %d\n",t,t*2,t*3);}
                        }
                        
                    }
                    
                }
                
            }
        }
    }
    return 0;
}
相关标签: c++