阿哈磊的挑战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;
}
### C语言编程题答案及学习资料 以下是关于C语言编程题的答案和相关学习资料的详细内容: #### 1. 题目一:分解质因数 ```c #include <stdio.h> int main() { int i, n; scanf("%d", &n); printf("%d=", n); for (i = 2; i <= n; i++) { while (n != i) { if (n % i == 0) { printf("%d*", i); n = n / i; } else { break; } } } printf("%d", n); return 0; } ``` 上述代码实现了将输入的整数分解为质因数的功能[^1]。用户可以通过修改输入值来测试不同数字的质因数分解。 #### 2. 题目二:计算阶乘 ```c #include <stdio.h> int main() { int i = 0, n = 0, ret = 1; scanf("%d", &n); for (i = 1; i <= n; i++) { ret *= i; } printf("%d\n", ret); return 0; } ``` 此代码用于计算并输出给定整数 `n` 的阶乘结果[^2]。 #### 3. 题目三:计算阶乘累加和 ```c #include <stdio.h> int main() { int i = 0, n = 0, ret = 1, sum = 0; scanf("%d", &n); for (i = 1; i <= n; i++) { ret *= i; sum += ret; } printf("%d\n", sum); return 0; } ``` 该程序可以计算从 `1!` 到 `n!` 的所有阶乘之和。 #### 4. 题目四:在有序数组中查找指定数字 以下是一个简单的二分查找算法实现,用于在一个升序排列的数组中查找特定数字: ```c #include <stdio.h> int binarySearch(int arr[], int left, int right, int target) { while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; } else if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; } int main() { int arr[] = {1, 3, 5, 7, 9, 11}; int n = sizeof(arr) / sizeof(arr[0]); int target; scanf("%d", &target); int result = binarySearch(arr, 0, n - 1, target); if (result == -1) { printf("Element not found\n"); } else { printf("Element found at index %d\n", result); } return 0; } ``` 这段代码通过二分查找法快速定位目标值的位置。 #### 5. 关于变量声明与定义的区别 在C语言中,变量的声明仅告知编译器变量的存在及其类型,而不会分配内存;而变量的定义不仅声明了变量,还会为其分配实际的存储空间。例如: ```c extern int x; // 声明 int x = 10; // 定义 ``` 函数的声明与定义也遵循类似的规则[^3]。 --- ### 学习资料推荐 1. **《C程序设计语言》**(The C Programming Language)——由Dennis M. Ritchie和Brian W. Kernighan编写,是学习C语言的经典教材。 2. **在线资源**:如菜鸟教程、优快云博客等网站提供了丰富的C语言学习资料和实例代码。 3. **LeetCode/Codeforces**:这些平台包含大量C语言相关的编程练习题,适合初学者和进阶学习者。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值