阿哈磊的挑战11--16

  • 11题、在123456789中插入3个乘号,使得乘积最大?请问乘积最大是多少?
    • 根据符号的位置把 123456789 划分了 4 段,再让这四段相乘,取最大值。
    • 一开始是想一直套循环,

# include "stdio.h"
//请在123456789中插入3个乘号,使得乘积最大?请问乘积最大是多少?

int product(int i, int j)
{
    int p=0;
    for (i=i; i<=j;i++)
    {
        p = p*10+i;   // 0*10+1 ==> 1*10+2 ==> 12*10+3 ==> 123*10+4
    }
    return p;
}

int main()
{
    int i, j, k, p=0;
    int s1, s2, s3, s4, s;
    for (i=1; i<7;i++)   // 第一部分到达的最大值
        for(j=1+i; j<8;j++)
            for (k=j+1; k<9; k++)
            {
                s1 = product(1,i);
                s2 = product(i+1, j);
                s3 = product(j+1, k);
                s4 = product(k+1, 9);
                s = s1*s2*s3*s4;
                if (s>p)
                    p = s;
            }
    printf("%d ", p);
    return 0;
}
  • 第12题、请在5483298756中插入3个乘号,使得乘积最大?请问乘积最大是多少?
    • 很明显我这个是错的,,因为int型的数据类型,最多处理10位数,所以显而易见的会越界,得出错误的数据。
    • 我的想法是,应该要把它装换成字符类型的再进行计算,,比如N位的数据可以分解为:  x=xn1+x2 \ y = y_1^n + y_2 那么x和y的乘积可计算为:$$\ xy = (x_1^n+x_2)( y_1^n + y_2) = x_1^n*y_1^n + (x_1y_2+x_2y_1) +x_2*y_2
      这样就将x和y装换成比较小的位数的乘积。
# include "stdio.h"
//请在5483298756中插入3个乘号,使得乘积最大?请问乘积最大是多少?
//数字越界啊,要用字符运算,,,不想做了,先空着。
int product(int i, int j)
{
    int n[10] = {5,4,8,3,2,9,8,7,5,6};
    printf("$%d$ $%d$  ", n[i-1],n[j-1]);
    unsigned int p=0;
    for (i=i; i<=j;i++)
    {
        p = p*10+n[i-1];
    }
    printf("#%d#\n", p);
    return p;
}

int main()
{
    int i, j, k;
    unsigned int s, p=0;
    int s1, s2, s3, s4;
    for (i=1; i<7;i++)
        for(j=1+i; j<8;j++)
            for (k=j+1; k<9; k++)
            {
                s1 = product(1,i);
                s2 = product(i+1, j);
                s3 = product(j+1, k);
                s4 = product(k+1, 10);
                s = s1*s2*s3*s4;
                printf("  ^%d^  \n", s);
                if (s>p)
                    p = s;
            }
    printf("%d ", p);
    return 0;
}
  • 第13题、求符合规定得数字
    • 沿用了上一题的代码,
# include "stdio.h"
//我已经想好了一个三位数abc(a是百位,b是十位,c是个位)。
//并且告诉你acb、bac、bca、cab、cba的和是2012。
//你知道我所想的那个数是多少吗?
int main()
{
    int a, b, c;
    int s1, s2, s3, s4, s5;
    for (a=0; a<=9;a++)
        for(b=0; b<=9;b++)
            for (c=0; c<=9; c++)
            {
                s1 = a*100 + c*10 + b; //acb
                s2 = b*100 + a*10 + c; //bac
                s3 = b*100 + c*10 + a; //bca
                s4 = c*100 + a*10 + b; //cab
                s5 = c*100 + b*10 + a; //cba

                if (s1+ s2+ s3+ s4+ s5 == 2012)
                    printf("%d, %d, %d ", a,b,c);
            }

    return 0;
}
  • 第14题、完美合数
    • 和深度算法类似吧
//请将1~99个阿拉伯数字分别填入9个□中。每个数字只能使用一次。使得等式成立。
//□□□+□□□=□□□
//例如173+286=459就是一个合理的组合,请问一共所有少种合理的组合?
//注意:173+286=459286+173=459 是同一种组合!
# include "stdio.h"

int total = 0;
int blook[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
int n[370], len;

void dfs(int step, int a[])
{
    int i, j, p = 0;
    if (step == 10)
    {
        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])
        {//满足要求,打印
            //数组占内存总空间,除以单个元素占内存空间大小

            for(j=0; j<370; j++)
            {
                if (n[j] == a[4] * 100 + a[5] * 10 + a[6] )  // 该数已经存在
                {
                    p = 1;   // 标记重复
                    break;
                }
            }
            if(p==0)
            {
                total += 1;  // 计数
                printf("%d%d%d + %d%d%d = %d%d%d\n", a[1],a[2],a[3], a[4], a[5], a[6], a[7], a[8], a[9]);   
                n[len] = a[1] * 100 + a[2] * 10 + a[3];
                len++;

            }

        }
        return;
    }

    for (i=1; i<=9; i++)
    {
        if(blook[i] == 0)
        {
            a[step] = i;    // 将数放入对应数组中,
            blook[i] = 1;    //1,表示该数已经被使用
            dfs(step+1, a);   // 递归调用
            blook[i] = 0;     // 回收,方便下一次调用
        }
    }
}


int main()
{
    int a[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
    dfs(1, a);
    printf(" %d ", total);
    return 0;
}
  • 第15题、完美积数
    • 和上一个相似的写法,就稍微改了一下。
//请将1~99个阿拉伯数字分别填入9个□中。每个数字只能使用一次。使得等式成立。
//□□*□□□=□□□□
//例如12*483=5796就是一个合理的组合,请问一共所有少种合理的组合?
//注意:12*483=5796483*12=5796 是同一种组合!

# include "stdio.h"

int total = 0;
int blook[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
int n[370], len;

void dfs(int step, int a[])
{
    int i, j, p = 0;
    if (step == 10)
    {
        if ((a[1] * 10 + a[2]) *( a[3]*100 + a[4] * 10 + a[5]) == a[6] *1000 + a[7] * 100 + a[8] * 10 + a[9])
        {//满足要求,打印
            total += 1;
            printf("%d%d * %d%d%d = %d%d%d%d\n", a[1],a[2],a[3], a[4], a[5], a[6], a[7], a[8], a[9]);           
        }
        return;
    }   
    for (i=1; i<=9; i++)
    {
        if(blook[i] == 0)
        {
            a[step] = i;  // 将数放入对应数组中,
            blook[i] = 1;  //1,表示该数已经被使用
            dfs(step+1, a);  // 递归调用
            blook[i] = 0;   // 回收,方便下一次调用
        }
    }
}

int main()
{
    int a[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
    dfs(1, a);
    printf(" %d ", total);
    return 0;
}
  • 第16题、10000000内7的倍数以及尾数为7的数的个数是多少
    • 前面做过一个类似的。
# include "stdio.h"

/* 10000000内7的倍数以及尾数为7的数的个数是多少*/
int main()
{
    int i, sum = 0, a;
    for (i=1; i<=10000000; i++)
    {
        a = i%10;
        if (a==7 || i%7 == 0)
        {
            sum++;
        }
    }
    printf("%d", sum);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值