算法 枚举

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);
    }
    
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容