快乐星空Maker 2023-11-05 15:53 采纳率: 23.1%
浏览 3

不会数三,额,不知道该咋写。

不会数三

蜗蜗来到了一个神奇的国度,这个国家计算的方式和地球上完全不一样:

他们用三进制表示数字;
他们在加法的时候从不进位,本来要进位进上去的那个数字会被直接丢掉。
例:

2+2
在这个国度就等于 1,因为按照三进制计算 2+2=11,但是不进位,所以等于 1;
14+7(十进制)在这个国度就等于 100(三进制),因为十进制中的 14+7就是三进制中的 112+21,按照三进制计算 112+21=210,但是在最后一位和倒数第二位的计算中出现了进位,当我们消去进位带来的影响,结果就等于 100。你可以这么去想,在列竖式做加法的时候,先看最右边一位,三进制下的 2+1,本来应该得到 0,进 1,但是这个国家不进位,所以这个原本应该进上去的 1就直接消失了,不管了,对之后没有影响了。
这一天蜗蜗打算和这个国度的人比试一下数学,不过蜗蜗不是很自信,需要你的帮助。蜗蜗会偷偷告诉你 n 个十进制的数 ai
,希望你帮忙算一下在这个神奇的国度,按照他们的计算法则,这些数加起来应该是多少。

输入格式
第一行一个整数 n
(十进制下);

接下来 n
行,每行一个正整数 ai
(十进制下)。

输出格式
一行一个整数表示加起来以后的答案(三进制下)。

样例输入

3
2
3
4

样例输出

20

样例解释
相当于三进制下 2+10+11,最后一位 2+1=0,倒数第二位 1+1=2。

数据范围
1≤n≤1000
0≤ai≤109
(十进制下)

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-05 18:43
    关注

    【以下回答由 GPT 生成】

    解决方案

    根据题目的要求,我们需要将输入的十进制数转换为三进制数,然后对这些三进制数进行相加,最后再转换为十进制数输出。

    以下是解决该问题的具体步骤:

    1. 首先,读取输入的整数n并存储起来。

    2. 创建一个数组来存储n个十进制数。

    3. 使用循环读取n个十进制数并将它们存储在数组中。

    4. 创建一个变量sum来存储加法的结果。

    5. 使用循环遍历数组中的每个十进制数。

    6. 对于每个十进制数,我们将其转换为三进制数。

    7. 在将其转换为三进制数的过程中,我们对其进行三进制加法操作,并将结果存储在sum中。

    8. 最后,将sum转换为十进制数并输出结果。

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

    #include<stdio.h>
    
    // 函数将十进制数转换为三进制数
    int decToTernary(int dec) {
        int ternary = 0;
        int base = 1;
    
        while(dec > 0) {
            // 取余数作为当前位的值
            int remainder = dec % 3;
    
            // 更新十进制数和基数
            dec = dec / 3;
            base = base * 10;
    
            // 三进制数累加
            ternary = ternary + (remainder * base);
        }
    
        return ternary / 10; // 去掉最后多余的0
    }
    
    // 函数将三进制数转换为十进制数
    int ternaryToDec(int ternary) {
        int dec = 0;
        int base = 1;
    
        while(ternary > 0) {
            // 取余数作为当前位的值
            int remainder = ternary % 10;
    
            // 更新三进制数和基数
            ternary = ternary / 10;
            base = base * 3;
    
            // 十进制数累加
            dec = dec + (remainder * base);
        }
    
        return dec / 3; // 去掉最后多余的0
    }
    
    int main() {
        int n;
        scanf("%d", &n);
    
        int decimals[n];
        for(int i = 0; i < n; i++) {
            scanf("%d", &decimals[i]);
        }
    
        int sum = 0;
        for(int i = 0; i < n; i++) {
            int ternary = decToTernary(decimals[i]);
            sum = sum + ternary;
        }
    
        int result = ternaryToDec(sum);
        printf("%d", result);
    
        return 0;
    }
    

    将上述代码保存为一个以.c为后缀名的文件,如solution.c,并使用C编译器编译运行该代码。

    输入示例:

    3
    2
    3
    4
    

    输出示例:

    20
    

    注意:以上的代码是通过将十进制数转换为三进制数,然后进行相加得到结果。也可以直接将十进制数进行相加,然后将相加后的结果转换为三进制数,两种方法可以得到相同的结果。



    【相关推荐】


    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/734740
    • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月5日

悬赏问题

  • ¥15 数据量少可以用MK趋势分析吗
  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
  • ¥15 大智慧怎么编写一个选股程序
  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中