⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pairs of integers(构造).cpp

📁 杭电acm解题报告2001---2099.
💻 CPP
字号:
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;

struct node {
    int v,len;
    bool operator < (const node & t) const {
        return v < t.v;
    }
}ans[110];
int ans_pos;
int n,len;
int e10[15];
int dig[15];
char n1[15],n2[15];
int num[15];

void dfs(int pos)
{
    int temp[15], temp2[15];
    int i,j,t;

    memcpy(temp, num,sizeof(num));
    memcpy(temp2, dig,sizeof(num));
    if (pos == len-1) {
        if (dig[pos] < 0) {
            return ;
        }
        if (num[ n1[pos] -'A'] != -1) {
            if (num[ n1[pos] -'A'] != dig[pos]) {
                return ;
            }
        }
        else {
            num[ n1[pos] -'A'] = dig[pos];
        }
        if (num[0] == 0 && n2[len-2] != 'A') {
            goto recover;
        }
        //make num
        i = 0;
        ans[ans_pos].len = len;
        while (num[i] == 0) {
            ans[ans_pos].len --;
            i ++;
        }
        t = 0;
        for (i=0;i<len;i++) {
            t += e10[i] * num[len-i-1];
        }
        ans[ans_pos ++].v = t;
        goto recover;
    }

    //carry
    if (dig[pos] < 0) {
        dig[pos] += 10;
        dig[pos +1] --; 
    }
    //select one branch to cal
    if (n1[pos] == n2[pos]) {//same
        if (num[ n1[pos] -'A'] != -1) {//be valued
            if (num[ n1[pos] -'A'] * 2 >= 10) {//have carry
                dig[pos+1] --;
            }
            dfs(pos+1);
        }
        else if (dig[pos] % 2 == 0) {//can be divied
            num[ n1[pos] -'A'] = dig[pos] / 2;
            dfs(pos+1);

            num[ n1[pos] -'A'] = (10+ dig[pos]) / 2;
            if (num[ n1[pos] -'A'] >= 10) {
                goto recover ;
            }
            dig[pos+1] --;
            dfs(pos+1);
        }
        else {
            goto recover ;
        }
    }
    else {//not same
        if (num[ n1[pos] -'A'] != -1) {//n1 be valued
            if (num[ n2[pos] -'A'] != -1) {//all be valued
                if (dig[pos] != num[ n1[pos] -'A'] + num[ n2[pos] -'A']) {
                    goto recover ;
                }
                dfs(pos+1);
            }
            else {//n2 not be valued
                if (dig[pos] >= num[ n1[pos] -'A']) {
                    num[ n2[pos] -'A'] = dig[pos] - num[ n1[pos] -'A'];
                    dfs(pos+1);
                }

                num[ n2[pos] -'A'] = 10+dig[pos] - num[ n1[pos] -'A'];
                if (num[ n2[pos] -'A'] >= 10) {
                    goto recover ;
                }
                dig[pos+1] --;
                dfs(pos+1);
            }
        }
        else {//n1 not be valued
            if (num[ n2[pos] -'A'] == -1) {//all not be valued
                for (i=0;i<10;i++) {//enum
                    num[ n1[pos] -'A'] = i;
                    if (num[ n1[pos] -'A'] <= dig[pos]) {
                        num[ n2[pos] -'A'] = dig[pos] - num[ n1[pos] -'A'];
                        dfs(pos+1);
                    }

                    t = num[ n2[pos] -'A'];
                    num[ n2[pos] -'A'] = 10+dig[pos] - num[ n1[pos] -'A'];
                    if (num[ n2[pos] -'A'] >= 10) {
                        num[ n2[pos] -'A'] = t;
                        continue ;
                    }
                    dig[pos+1] --;
                    dfs(pos+1);
                    dig[pos+1] ++;
                }
            }
            else {//n2 be valued
                if (dig[pos] > num[ n2[pos] -'A']) {
                    num[ n1[pos] -'A'] = dig[pos] - num[ n2[pos] -'A'];
                    dfs(pos+1);
                }
                num[ n1[pos] -'A'] = 10+dig[pos] - num[ n2[pos] -'A'];
                if (num[ n2[pos] -'A'] >= 10) {
                    goto recover ;
                }
                dig[pos+1] --;
                dfs(pos+1);
            }
        }
    }
recover:
    memcpy(num ,temp,sizeof(num));
    memcpy(dig ,temp2,sizeof(num));
    return ;
}

int main()
{
    int i,j,k,t;
    e10[0] =1;
    for (i=1;i<=10;i++) {
        e10[i] = 10 * e10[i-1];
    }

    while (scanf("%d", &n)==1) {
        if(n == 0) {
            break ;
        }
        len = 0;
        t = n;
        while (t) {
            dig[len ++] = t%10;
            t /= 10;
        }
        for (i=0;i<len;i++) {
            n1[i] = 'A'+i;
            n2[i] = '0';
            num[i] = -1;
        }
        reverse(n1,n1+len);
        ans_pos = 0;
        
        for (i=0;i<len;i++) {
            j = 0;
            for (k=len-1;k>=0;k--) {
                if (k == i) {
                    continue ;
                }
                n2[j ++] = k + 'A';
            }
            dfs(0);
        }
        sort(ans, ans+ans_pos);
        if (ans_pos == 0) {
            puts("0");
        }
        else {
            int unique = 1;
            for (i=1;i<ans_pos;i++) {
                if (ans[i].v != ans[i-1].v) {
                    unique ++;
                }
                else {
                    ans[i-1].v = -1;
                }
            }
            printf("%d\n", unique);
            for (i=0;i<ans_pos;i++) {
                if (ans[i].v != -1) {
                    printf ("%d + %0*d = %d\n", ans[i].v, ans[i].len-1, n-ans[i].v, n);
                }
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -