标题:菜鸡的求助
只看楼主
人生如雪
Rank: 1
等 级:新手上路
帖 子:3
专家分:7
注 册:2021-4-18
结帖率:0
已结贴  问题点数:10 回复次数:3 
菜鸡的求助
一个超难的题,望大佬帮我看看。

刘洪(约公元129~210),字元卓,东汉泰山郡蒙阴县(今山东省临沂市)人,东汉鲁王刘兴后裔,是我国古代杰出的天文学家和数学家,珠算发明者和月球运动不均匀性理论发现者,被后世尊为“算圣”。算盘是中国古代劳动人民发明创造的一种简便的计算工具。“珠算”一词﹐最早见于汉代徐岳撰的《数术记遗》,其中有云:“珠算,控带四时,经纬三才”。珠算是以算盘为工具进行数字计算的一种方法,被誉为中国的第五大发明。

在C语言世界中也有一把神奇的算盘,它的特点是第​位使用的是​进位制,即算盘右起第一位是二进制位,第二位是三进制位,以此类推;我们规定算盘的前15位沿用16位进制的基本运算与字母,对于整体有表示关系如表中所示。

十进制数字    0    1    2    3    4    5    6    7    8    9    10    11    12    13    14    15    16    17    18
表示方式    0    1    2    3    4    5    6    7    8    9    a    b    c    d    e    f    T    I    B

请你根据给出的算式对算盘进行简单的加减法运算,其中设置补码机制:对于数字溢出与减法运算采取补码运算,即对于算盘表示的模相减后加一。

输入格式


第一行一个正整数T,表示数据组数。

之后T行每行一个算式a+b或a-b,表示要计算的两个数在该算盘下的表示,保证给出的两个数对应的字符串合法,并且无前导零。


输出格式


T行,每行一个字符串,代表计算后的结果在该算盘下的表示,注意不要输出前导零。


数据范围


​1<=T<=10,1<=len(a),len(b)<=18


样例输入1
1

BIT000011111110000+194000000002021


样例输出1

BIT194011111112021

样例输入2
1

0-1


样例输出2


BITfedcba987654321

搜索更多相关主题的帖子: 计算 输出 运算 表示 
2021-04-18 14:22
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
稀里糊涂的题目
因为最多19位,因此数值最大是 19!-1 = 121645100408831999,只需要一个57bits的整型就可存储它
所以,一个简单的办法是将它们转换为 uint64_t 再计算

程序代码:
#include <stdio.h>
#include <stdint.h>
#include <string.h>

uint64_t fool2normal( const char* s )
{
    uint64_t result = 0;
    uint64_t radix = 1;
    for( const char *pend=s+strlen(s), *p=pend; p!=s;  )
    {
        radix *= pend - --p;
        const char* r = "0123456789abcdefTIB";
        result += (strchr(r,*p)-r) * radix;
    }
    return result;
}

const char* normal2fool( uint64_t n )
{
    _Thread_local static char buf[20] = { [sizeof(buf)-1]='\0' }; // _Thread_local
    char *pend = buf+sizeof(buf) - 1;
    char* p = pend;
    for( ; n!=0; --p )
    {
        p[-1] = "0123456789abcdefTIB"[n%(pend-p+2)];
        n /= pend-p+2;
    }
    if( p == pend )
        *--p = '0';
    return p;
}
int main( void )
{
    unsigned t;
    scanf( "%u", &t );

    while( t-- )
    {
        char a[19],op,b[19];
        scanf( " %[0123456789abcdefTIB] %c %[0123456789abcdefTIB]", a, &op, b );
        if( op == '+' )
            puts( normal2fool( (fool2normal(a)+fool2normal(b))%121645100408832000 ) );
        else if( op == '-' )
            puts( normal2fool( (fool2normal(a)+121645100408832000-fool2normal(b))%121645100408832000 ) );
    }
}
2021-04-19 14:37
人生如雪
Rank: 1
等 级:新手上路
帖 子:3
专家分:7
注 册:2021-4-18
得分:0 
回复 2楼 rjsp
程序会报错
20    5    C:UsersdellDesktop未命名1.cpp    [Error] '_Thread_local' was not declared in this scope
21    18    C:UsersdellDesktop未命名1.cpp    [Error] 'buf' was not declared in this scope
2021-04-20 22:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 3楼 人生如雪
两个办法
要么你换个符合C标准的编译器
要么删掉_Thread_local,反正你只是做作业,不需要代码健壮
2021-04-21 11:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-505490-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.271581 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved