CSUFT 1003 All Your Base

1003: All Your Base

Time Limit: 1 Sec    Memory Limit: 128 MB
Submit: 4    Solved: 2

Description

Premise: Given a specification for a “base” (well, actually a mixed radix number system), take in pairs of numbers written in our “base”, perform a specified operation on them and output the result in our base.

The Base: A number system where the right-most digit (digit 1) can be a counting number between 0 and 1, the second right-most digit (digit 2) can be a counting number between 0 and 2 and, more generally, each digit n (as labeled from the right) can have values between 0 and n. After 9, upper case letters are used, starting with A and going through Z. After the highest digit (which can be 0-Z), no further digits are possible; any numbers which go past that digit are invalid. Negative numbers are prefixed with a single “-” sign. Numbers never have leading zeros, with the exception of zero itself, which is represented by a single “0” character.

Operations: Addition (+) and subtraction (-): The numbers are added or subtracted as normal (including carrying, borrowing, etc).

Input

  • The first line of input is the number (base 10) of operations that need to be performed.
  • Each following line will be at most 1000 bytes and will consist of a variable-radix number, a space, a single character indicating the operation (+, or -), a space, another variable-radix number, and a newline (LF).
  • Either number for any operation (and also the result) may be negative.

Output

  • For each operation in the input, a single line of output should be produced containing either the result (a variable-radix number) or the string “Invalid”) (without quotes) followed by a newline (LF).
  • If either of the input numbers or the resulting number is not valid in the number system, or an error is encountered while performing the operation, the result is invalid.

Sample Input

3
3 + 5
9987654321 + 1
-A000000000 - 1

Sample Output

Invalid
A000000000
-A000000001

HINT

 

Source

 

 
C语言差点写炸了,/(ㄒoㄒ)/~~,还是基本功不牢。
熟悉一下java,要注意的是:把每一位的权值计算出来,是 d[i] = d[i-1]*i;
把String 转成大整数,相加减得到结果,再返回去,去掉前导零。怎么得到数字,只要除以权值d[i];
//package Main;
 
import java.util.*;
 
import java.math.*;;
 
public class Main {
 
    BigInteger[] digit = new BigInteger[40];
    BigInteger A, B, C;
    boolean flag = true;
 
    void Getdigit() {
        digit[1] = BigInteger.ONE;
        for(int i=2;i<40;i++) {
            digit[i] = digit[i-1].multiply(BigInteger.valueOf(i));
        }
    }
     
    int GetVal(char c) {
        if(c<='9'&&c>='0')
            return c-'0';
        else return c-'A'+10; 
    }
     
    char RetVal(BigInteger i) {
        if(i.intValue()<10)
            return (char)(i.intValue()+'0');
        else return (char)(i.intValue()-10+(int)'A');
    }
 
    BigInteger Check(String num) {
        BigInteger ret = BigInteger.ZERO;
        for(int i=num.length()-1,base = 2;i>=0;i--,base++) {
            if(num.charAt(i)=='-') break;
            int tm = GetVal(num.charAt(i));
            if(tm>=base)
            {
                flag = false;
                return ret;
            }
            ret = ret.add(digit[base-1].multiply(BigInteger.valueOf(tm)));
        }
        if(ret.compareTo(digit[36])>=0) {
            flag = false;
            return ret;
        }
        if (num.charAt(0)=='-') {
            ret = BigInteger.ZERO.subtract(ret);
        }
        return ret;
    } 
 
    void Print(BigInteger num) {
        if(num.compareTo(BigInteger.ZERO)<0)
        {
            System.out.printf("-");
            num = BigInteger.ZERO.subtract(num);
        }
        int i = 35;
        for(;i>1;i--) {
            if(num.divide(digit[i]).compareTo(BigInteger.ZERO)>0)
                break;
        }
        for(;i>=1;i--) {
            System.out.printf("%c", RetVal(num.divide(digit[i])));
            num = num.mod(digit[i]);
        }
        System.out.println();
         
    }
 
    void main() {
        Getdigit();
        String num1, num2, op;
        Scanner cin = new Scanner(System.in);
        int cas = cin.nextInt();
        for (int i = 0; i < cas; i++) {
 
            flag = true;
            num1 = cin.next();
            op = cin.next();
            num2 = cin.next(); 
 
            A = Check(num1);
            B = Check(num2);
 
            if (!flag) {
                System.out.println("Invalid");
                continue;
            }
            if (op.charAt(0) == '+') {
                C = A.add(B);
            } else {
                C = A.subtract(B);
            }
            if (C.abs().compareTo(digit[36]) >= 0) {
                System.out.println("Invalid");
                continue;
            } else {
                Print(C);
            }
 
        }
    }
 
 
    public static void main(String[] args) {
        new Main().main();
    }
 
}
 
/**************************************************************
    Problem: 1003
    User: YinJianZuiShuai
    Language: Java
    Result: Accepted
    Time:196 ms
    Memory:8424 kb
****************************************************************/

转载于:https://www.cnblogs.com/TreeDream/p/6057384.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值