pragma mark - - 填上不同数字等式成立 问题
/*
___ + ___ = ___ 在下划线上填上1~9,每个数字只能使用一次,使等式成立。
有多少种填法
*/
-(void)test1 {
int a[10];
int book[10]; // 标记 数字是否出现 出现记为1
int total=0;
for (a[1]=1; a[1]<=9; a[1]++) {
for (a[2]=1; a[2]<=9; a[2]++) {
for (a[3]=1; a[3]<=9; a[3]++) {
for (a[4]=1; a[4]<=9; a[4]++) {
for (a[5]=1; a[5]<=9; a[5]++) {
for (a[6]=1; a[6]<=9; a[6]++) {
for (a[7]=1; a[7]<=9; a[7]++) {
for (a[8]=1; a[8]<=9; a[8]++) {
for (a[9]=1; a[9]<=9; a[9]++) {
// 初始化book
for (int i=1; i<=9; i++) {
book[i]=0;
}
// book 标记 出现标记为1
for (int i=1; i<=9; i++) {
book[a[i]] =1;
}
// 计算 出现几个不同的数字
int sum=0;
for (int i=1; i<=9; i++) {
sum +=book[i];
}
// 表示 每个数字都出现了一次
if (sum==9) {
if ((a[1]*100+a[2]*10+a[3]) +(a[4]*100+a[5]*10+a[6]) == (a[7]*100+a[8]*10+a[9])) {
NSLog(@"%d%d%d+%d%d%d=%d%d%d",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
total ++;
}
}
}
}
}
}
}
}
}
}
}
NSLog(@"总共有%d种方式",total);
}
pragma mark - - 火柴棍问题
/*
假设有n根火柴,希望拼出A+B=C的等式 有多少种拼法
*/
-(void)test2 {
int a,b,c,n;
int sum=0;
n=18;
for ( a=0; a<=1111; a++) {
for ( b=0; b<=1111; b++) {
c=a+b;
// 计算所需火柴数 n-4,是由于+和=各用2根火柴
if (func1(c)+func1(b)+func1(a) == n-4) {
NSLog(@"%d+%d=%d",a,b,c);
sum++;
}
}
}
NSLog(@"一共有%d种拼法",sum);
}
// 计算数字所需的火柴数
int func1(int x) {
// 每个数所需要的火柴数0~9
int f[10] = {6,2,5,5,4,5,6,3,7,6};
int sum=0;
while (x/10!=0) {
int t = x%10;
sum += f[t];
x=x/10; // 去掉x的末尾数 例如x的值为123,现在x为12;
}
// 最后加上x为个位数 所需要的火柴数
sum +=f[x];
return sum;
}
pragma mark - - 数的全排列
/*
12的全排列为 12 21
123的全排列为 123 132 213 231 312 321
那么 1...n的全排列?
*/
-(void)test3 {
int n;
n=4;
int a[10];
// 初始化 a[10]
for (int i=0; i<10; i++) {
a[i]=0;
}
int book[10];
for (a[1]=1; a[1]<=n; a[1]++) {
for (a[2]=1; a[2]<=n; a[2]++) {
if (n==1) {
a[2]=0;
func(a, book,n);
break;
}
for (a[3]=1; a[3]<=n; a[3]++) {
if (n==2) {
a[3]=0;
func(a, book,n);
break;
}
for (a[4]=1; a[4]<=n; a[4]++) {
if (n==3) {
a[4]=0;
func(a, book,n);
break;
}
for (a[5]=1; a[5]<=n; a[5]++) {
if (n==4) {
a[5]=0;
func(a, book,n);
break;
}
for (a[6]=1; a[6]<=n; a[6]++) {
if (n==5) {
a[6]=0;
func(a, book,n);
break;
}
for (a[7]=1; a[7]<=n; a[7]++) {
if (n==6) {
a[7]=0;
func(a, book,n);
break;
}
for (a[8]=1; a[8]<=n; a[8]++) {
if (n==7) {
a[8]=0;
func(a, book,n);
break;
}
for (a[9]=1; a[9]<=n; a[9]++) {
func(a, book,n);
}
}
}
}
}
}
}
}
}
}
void func(int a[],int book[],int n) {
// 初始化 book数组 标记 a[1]~a[9] 是否出现
for (int i=0; i<10; i++) {
book[i]=0;
}
// book 如果某个数出现过就标记为1
for (int i=1; i<10; i++) {
book[a[i]] = 1;
}
//统计总共出现了多少个不同的数
int sum = 0;
for (int i=1; i<10; i++) {
sum +=book[i];
}
if (sum==n) {
// 去0
long int t=0;
for (int i=1; i<10; i++) {
t+=a[i]*pow(10, 10-i-1);
}
t=t/pow(10, 10-n-1);
NSLog(@"%ld",t);
}
}