《算法竞赛入门经典(第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;
}
上一篇: 实验题目:迷宫问题
下一篇: uva 10205 模拟