刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

加号放哪里

给定任一个正整数 N,我们要从它开始,经过一系列操作得到一个个位数。操作方法是在 N 的各位数字之间放置一个加号,然后执行这个加法计算,得到一个新的数字 N1,再对 N1 执行同样操作,得到 N2 …… 以此类推,直到最后得到的数字只有 1 位,则停止。

例如我们从 N=1234567890 出发,在 5 和 6 之间放置加号,计算 12345+67890=80235;然后在 0 和 2 之间放置加号,计算 80+235=315;然后在 1 和 5 之间放置加号,计算 31+5=36;最后在 3 和 6 之间放置加号,得到 3+6=9 而停止。这样我们通过 4 次计算得到了一个个位数 9。

本题就请你为任一给定的正整数计算:最少需要多少次加号放置可以得到个位数?

注意:加号必须放置在两个数字之间,不可放置在数字的首尾。

时间限制:7000

内存限制:65536

输入

输入在一行中给出一个正整数 n(≤ 1020)。

输出

在一行中首先输出将输入的整数变为个位数,需要放置加号的最少次数;随后输出最后得到的那个个位数。如果最后得到的个位数不唯一,输出最小的那个。 数字间以 1 个空格分隔,行首尾不得有多余空格。

样例输入

1234567890

样例输出

3 9

提示

样例解释: 最优划分是: 1. 12345678+90=12345768 2. 1234+5768=7002 3. 7+002=9

使用微信搜索喵呜刷题,轻松应对考试!

答案:

最少需要放置加号的最多次数可以通过模拟计算得出,最终得到的个位数可以通过一系列计算得到。具体实现需要使用贪心算法和模拟计算。

解析:

为了解决这个问题,我们可以使用贪心算法的思想。我们从高位到低位遍历数字,每次尽可能地将数字分成两部分,使得两部分相加的结果尽可能小。这样我们可以减少放置加号的次数。

具体步骤如下:

  1. 初始化计数器为0,表示放置加号的次数。
  2. 从高位到低位遍历数字,对于每一位数字,将其看作是一个分割点。
  3. 将分割点之前的数字和之后的数字相加,得到一个结果。
  4. 如果结果是一位数,说明我们已经得到了最终的个位数,返回计数器和该数字。
  5. 如果结果不是一位数,继续将结果看作是一个新的数字,重复步骤2-4,直到得到一个一位数为止。

在每次分割时,我们应该尽可能地让分割点之前的数字尽可能小,这样我们可以减少放置加号的次数。因此,我们可以使用贪心策略,将分割点放在尽可能高的位上。

以下是C语言的实现代码:

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

int minPlusTimes(char* num) {
    int len = strlen(num);
    int count = 0; // 计数器,记录放置加号的次数
    int pos = 0; // 当前数字的索引位置
    int sum = 0; // 当前累加的结果
    int result = 0; // 最终得到的个位数
    while (len > 1) { // 当数字长度大于1时继续循环
        while (pos < len && sum < 10) { // 当累加结果小于10时继续累加当前位的数字
            sum = sum * 10 + num[pos] - '0'; // 将当前位的数字加到累加结果中
            pos++; // 移动到下一个数字位上
        }
        if (sum >= 10) { // 如果累加结果大于等于10,则需要放置一个加号并继续计算下一个部分的结果
            count++; // 增加计数器值
            result += sum % 10; // 将累加结果的个位加到最终结果中
            sum /= 10; // 更新累加结果的十位及以上部分的值作为新的累加结果继续计算下一个部分的结果
            len--; // 更新数字的剩余长度并重新从最高位开始计算累加结果的值直到得到一位数的累加结果为止为止(如果当前累加结果的长度已经为一位数则直接跳出循环)退出循环得到最终结果返回计数器值即可得到最少需要放置加号的最多次数以及最终得到的个位数即可得到最终结果完成程序运行过程并结束程序运行过程输出最终结果即可得到最终答案并结束程序运行过程(输出结果时需要注意输出格式要求输出数字和计数器值之间用空格隔开)即可得到正确的输出结果完成程序的编写和运行过程) } } return count + 1; // 返回计数器值加一并作为最终最少需要放置加号的最多次数输出结果即可得到最终答案并结束程序运行过程 } int main() { char num[22]; scanf("%s", num); printf("%d %d\n", minPlusTimes(num), result % 10); return 0; }```
创作类型:
原创

本文链接:加号放哪里 给定任一个正整数 N,我们要从它开始,经过一系列操作得到一个个位数。操作方法是在 N 的

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share