7.1 简单枚举

如果数据量小,完全可以使用暴力枚举的方法,不必浪费时间思考。

7.1.1 除法

枚举一个数,然后通过这个数*n得到另一个数,从而减少枚举量。

c#include <stdio.h>
#include <string.h>

const int maxn = 10;

bool check(int a, int b, int n)
{
    // a < b
    char s1[maxn];
    char s2[maxn];
    bool num[10];
    bool z = 0;
    memset(num, 0, sizeof(num));
    sprintf(s1, "%d", a);
    int len = strlen(s1);
    if(len < 5)
    {
        num[0] = 1;
        z = 1;
    }
    int t;
    for(int i = 0; i < len; i++)
    {
        t = s1[i] - '0';
        if(num[t])
            return false;
        else
            num[t] = 1;
    }

    sprintf(s2, "%d", b);
    len = strlen(s2);
    if(len > 5)
        return false;

    for(int i = 0; i < len; i++)
    {
        t = s2[i] - '0';
        if(num[t])
            return false;
        else
            num[t] = 1;
    }

    for(int i = 0; i < 10; i++)
        if(! num[i]) return false;

    if(z)
        printf("%s/0%s=%d\n", s2, s1, n);
    else 
        printf("%s/%s=%d\n", s2, s1, n);

    return true;
}

const int maxnum = 1000000;

int main()
{
    int n, j;
    while(~scanf("%d", &n))
    {
        for(int i = 1; i < maxnum; i++)
        {
            j = i * n;
            check(i, j, n);
            // printf("%d ", i);
        }

        printf("\n");
    }
    return 0;
}

7.1.2 最大乘积

直接暴力枚举两个起点即可。

c#include <stdio.h>

const int maxn = 1000;

int main()
{
    int n;
    int qu[maxn];
    int product;
    int max;
    while(~scanf("%d", &n))
    {
        max = 0;
        for(int i =0 ; i< n ;i++)
            scanf("%d", &qu[i]);

        for(int i = 0; i <n ;i++)
        {
            for(int j = i+1; j < n; j++)
            {
                product = 1;
                for(int k = i; k <= j; k++)
                    product = product * qu[k];
                max = max > product ? max : product;
            }
        }       

        printf("%d\n", max);
    }
    return 0;
}

7.1.3 分数拆分

c#include <stdio.h>
#include <queue>

using namespace std;

struct group
{
    int x;
    int y;
    group(){}
    group(int _x, int _y)
    {
        x = _x;
        y = _y;
    }
};


int main(int argc, const char *argv[])
{
    int k, cnt;
    while(~scanf("%d", &k))
    {
        int x;
        queue <group> q;
        cnt = 0;
        for(int i = k+1; i <= 2*k; i++)
        {
            if((i * k) % (i - k) == 0)
            {
                x = (i*k) / (i-k);
                if(x >= i)
                {
                    cnt ++;
                    q.push(group(x, i));
                }
            }
        }

        printf("%d\n", cnt);
        group a;
        while(!q.empty())
        {
            a = q.front();
            q.pop();
            printf("1/%d = 1/%d + 1/%d\n", k, a.x, a.y);
        }
    }
    return 0;
}

7.1.4 双基回文数

又熟悉了下进制的转换~

c#include <iostream>
#include <stdio.h>

using namespace std;

const int maxn = 1000;
int num[maxn];

bool trans(int n, int b)
{
    int l = 0;
    while(n != 0)
    {
        num[l++] = n % b;
        n /= b;
    }

    for(int i = 0; i < l/2; i++) 
        if(num[i] != num[l-i-1]) 
            return false;
    // printf("b: %d\n", b);
    return true;
}

int main()
{
    int n, i;
    int cnt;
    bool found;
    while(~scanf("%d", &n))
    {
        while(1)
        {
            cnt = 0;
            found = false;
            for(int i = 2; i <= 10; i++)
            {
                if(trans(n, i)) cnt++;
                if(cnt > 1) 
                {
                    printf("%d\n", n);
                    found = 1;
                    break;
                }
            }
            if(found) break;
            n++;
        }
    }
    return 0;
}

svtter
209 声望37 粉丝

更喜欢原型开发


引用和评论

0 条评论