zzulioj - 2624: 小H的奇怪加法

题目链接:http://acm.zzuli.edu.cn/problem.php?id=2624

题目描述

小H非常喜欢研究算法,尤其是各种加法。没错加法包含很多种,例如二进制中的全加,半加等。
全加:对两个输入数据位相加,输出一个结果位和进位,有进位输入的加法。
半加:对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法。异或操作就是半加。C语言中,‘^’是异或运算符
但是常见的加法都是十进制的,人们习惯使用十进制数,并且默认一个数字的每一位都是十进制的。前几天,小H听说ADD星有一种新的加法,于是去了ADD星。他发现在ADD星人的世界里,每个数字的每一位都可以是不同进制的,这种奇怪且麻烦的数字称为“Add数”。例如“……0687”就表示最低位是7进制数、倒数第2位是8进制数、第3位是6进制数、第4位是10进制数,等等。每一位的进制d或者是0(表示十进制)、或者是[2,9]区间内的整数。理论上这个进制表应该包含无穷多位数字,进制表中没有给出的,都认为是10进制。

输入

首先在第一行给出一个N位的进制表(0 < N <=20),以回车结束。 随后两行,每行给出一个不超过N位的非负的Add数。

输出

在一行中输出两个Add数之和。

样例输入 Copy

7170687
03236
445

样例输出 Copy

4104

提示

例如对应进制表“0687”,该如何计算“3236+445”呢?我们得首先计算最低位:6+5=11;因为最低位是7进制的,所以我们得到4和1个进位。倒数第2位是:3+4+1(进位)=8;因为此位是8进制的,所以我们得到0和1个进位。第3位是:2+4+1(进位)=7;因为此位是6进制的,所以我们得到1和1个进位。第4位是:3+1(进位)=4;因为此位是10进制的,所以我们就得到7。最后我们得到:3236+445=4104。

其实就是大整数加法的变形,我在另一篇博文里面也有模板,可以参考一下https://www.cnblogs.com/shuitiangong/p/12063528.html

#include<set>
#include<map>
#include<stack>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cctype>
#include<string>
#include<vector>
#include<climits>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)
#define mst(a) memset(a, 0, sizeof(a))
#define _test printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const double eps = 1e-7;
const int INF = 0x3f3f3f3f;
const ll ll_INF = 0x3f3f3f3f3f3f3f;
const int maxn = 1e3+10;
char ls[20];
char num1[maxn], num2[maxn], res[maxn];
void add() { //高精度整数加法(改)
    mst(res);
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int len3 = strlen(ls);
    reverse(num1, num1+len1);
    reverse(num2, num2+len2);
    int len, carry;
    len = carry = 0;
    for (int i = 0; i<len1 || i<len2; ++i) {
        carry += i<len1 ? num1[i] - ‘0‘ : 0;
        carry += i<len2 ? num2[i] - ‘0‘ : 0;
        if (ls[len3-i-1] != ‘0‘) { //非0即为2~9进制
            res[len] = carry%(ls[len3-i-1]-‘0‘) + ‘0‘;
            carry /= (ls[len3-i-1] - ‘0‘);
        }
        else { //是0就按10进制
            res[len] = carry%10 + ‘0‘;
            carry /= 10;
        }
        ++len;
    }
    if (carry) //判断最后一位是不是有进位
        res[len++] = carry + ‘0‘;
    res[len] = 0;
    for (int i = len-1; i>0; --i) { //排除先导0的影响 注意 不能直接i>=0, 如果结果刚好等于0就会出错了
        if (res[i] == ‘0‘)
            res[i] = 0;
        else
            break;
    }
    reverse(res, res+strlen(res));
}
int main(void) {
    scanf("%s %s %s", ls, num1, num2);
    add();
    printf("%s\n", res);
    return 0;
}

原文地址:https://www.cnblogs.com/shuitiangong/p/12078740.html

时间: 2025-01-17 15:43:17

zzulioj - 2624: 小H的奇怪加法的相关文章

【渗透笔记】拿下某小H网的全过程

自从班上A片小王子的7个T资源被封了以后,本小白为造福全班同学,尝试拿下个小H网,先用webrobot搜某些只有小H网才会出现的关键词 本以为直接导出放御剑里跑就行了,然并软.于是用awvs扫了一下,也没什么用.从cms下手吧放进椰树里 百度一下maxcms的漏洞看到这样一条 http://www.2cto.com/index.php/364.html发现注入点 http://www.xxxxx.com/inc/ajax.asp?action=videoscore&id=11 ,放进sqlmap

小H和密码

小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1~N,每个转盘有M个位置,每个位置上要么有一个小写字母,要么没有任何字符.一个密码能被转盘表示出,当且仅当指定每个转盘上面的某一个位置,然后将这些位置按照所属的转盘编号顺次连接(空位置直接忽略),可以得到这个密码     小H并没有得到任何线索,因此只能猜,她一共猜了Q次,但并不知道自己猜的密码能否被表示出来,于是她向你求助 输入描述: 第1行,三个整数N,M,Q第2~N+1行,每行一个长度为M的字符串,依次表示每个

一个简洁的小H车调运模型

一个简洁的小H车调运模型 不久前, 帝都B城市到处都是小H车, 理想的小H车应该是布朗运动\均匀分布,可是现实上它们就是不均匀.于是有如下问题: 观察帝都 HD区SY村区域,将其划分成10个用车点,用大数据回归预测出第二天(周一)的用车数据如下,夜晚开始调运,务必满足第二天的需求,极小化调运总里程. 数据项 符号 用车点 地区  i 1 2 3 4 5 6 7 8 9 10 X-坐标  X[i] 0 200 155 70 90 45 88 44 60 111 Y-坐标 Y[i] 0 200 30

ZZULIoj 1908 小火山的围棋梦想

Description 小火山最近喜欢上了围棋. 对于围棋,其实小火山是一窍不通的.现在棋盘上,有很多小火山的棋子. 如果棋盘上有这样的一个位置, 那么这个位置也会变成小火山 的棋子:这样的位置是指小火山的棋子将该位置围起来. 现在,小火山想知道实际棋盘是什么样子的. 你快来帮帮他吧! Input 输入第一行是一个整数T(T <= 30), 表示一共有T组数据. 每组数据,第一行为两个整数n, m(1 <= n, m <= 25),  随后一个n*m的矩阵代表棋盘,其中".&q

ZZULIoj 1913: 小火山的计算能力

Description 别人说小火山的计算能力不行,小火山很生气,于是他想证明自己,现在有一个表达式,他想计算出来. Input 首先是一个t(1<=20)表示测试组数.然后一个表达式,表达式长度不超过200,只有加法和减法,并且保证第一个字符不会是运算符号,最终结果小于2^63-1. Output 输出运算结果. Sample Input 2 1+1 2+1-1 Sample Output 2 2 1 #include<cstdio> 2 #include<string.h>

ZZULIoj 1907 小火山的宝藏收益

Description 进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通. 每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关.如果小火山取走了这个房间的宝藏,那么这个房间通往其他房间的门就永远打不开了,也就是说后面的宝藏小火山是得不到了(进入这个房间的门是不会关闭的,小火山还是可以回去的):如果小火山不取这个宝藏,而是去打开通往另一房间的门,那么这个房间的宝藏就会消失, 小火山就得不到这个房间的宝藏. 不过,小火山已经有了藏宝图,知道每一个房间的宝藏的价

zzulioj 1907小火山的宝藏交易(dfs记忆化搜索)

#include <stdio.h> #include <algorithm> #include <string.h> #include <vector> using namespace std; int m, n, vis[11000]; long long dp[11000], v[11000]; vector<int>Q[11000]; long long dfs(int start) { int len; len = Q[start].s

Wannafly挑战赛10 D 小H的询问(线段树)

题目链接  Problem D 这个题类似 SPOJ GSS3 做过那个题之后其实就可以秒掉这题了. 考虑当前线段树维护的结点 在那道题的基础上,这个题要多维护几个东西,大概就是左端点的奇偶性,右端点的奇偶性. 以及当前结点代表的区间是否是一个有效的子序列. 时间复杂度$O(nlogn)$ #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #de

luogu 1972 小H的项链

1.莫队算法 TLE 80 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) using namespace std; const int N=50005,M=200005; int h[N],n,m,a[N],ans[M]; struct node{ int l,r,id; bool operator<(const node&b)const{ if(h[l]==h[b.l])