T1
a + b
时间限制:1 秒
内存限制:32 兆
特殊判题:否
题目描述: 实现一个加法器,使其能够输出 a+b 的值。
输入: 输入包括两个数 a 和 b,其中 a 和 b 的位数不超过 1000 位。
输出可能有多组测试数据,对于每组数据,输出 a+b 的值。
样例输入:
2 6
10000000000000000000 10000000000000000000000000000000
样例输出:
8
10000000000010000000000000000000
//
// main.cpp
// biga_bplus
//
// Created by Apple on 2019/8/20.
// Copyright © 2019 Apple_Lance. All rights reserved.
//
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
struct bigInteger{
int digit[1000];
int size;
void init(){
for(int i = 0;i<1000;i++)
digit[i] = 0;
size = 0;
}
void set(char str[]){
init();
int L = strlen(str);
for(int i = L - 1, j = 0, t = 0, c = 1;i >= 0;i--){
t += (str[i] - '0') * c;
c *= 10;
j++;
if(j == 4 || i == 0){
digit[size++] = t;
t = 0;
c = 1;
j = 0;
}
}
}
void output(){
for(int i = size - 1;i >= 0;i--){
if(i != size - 1)
printf("%04d", digit[i]);
else
printf("%d", digit[i]);
}
printf("\n");
}
bigInteger operator+(const bigInteger &A)const{
bigInteger ret;
ret.init();
int carry = 0;
for(int i = 0;i < A.size || i < size;i++){
int tmp = A.digit[i] + digit[i] + carry;
carry = tmp / 10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if(carry != 0)
ret.digit[ret.size++] = carry;
return ret;
}
}a, b, c;
char str1[1000], str2[1000];
int main(int argc, const char * argv[]) {
while(scanf("%s%s", str1, str2) != EOF){
a.set(str1);
b.set(str2);
c = a + b;
c.output();
}
return 0;
}
T2
N 的阶层
时间限制:3 秒
内存限制:128 兆
特殊判题:否
题目描述 输入一个正整数 N,输出 N 的阶乘。
输入: 正整数 N(0<=N<=1000)
输出: 输入可能包括多组数据,对于每一组输入数据,输出 N 的阶乘
样例输入:
4
5
15
样例输出:
24
120
1307674368000
//
// main.cpp
// Biga_bMultiple
//
// Created by Apple on 2019/8/20.
// Copyright © 2019 Apple_Lance. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct bigInteger{
int digit[1000];
int size;
void init(){
for(int i = 0;i<1000;i++)
digit[i] = 0;
size = 0;
}
void set(int x){
init();
do{
digit[size ++] = x % 10000;
x /= 10000;
}while(x != 0);
}
void output(){
for(int i = size - 1;i >= 0;i--){
if(i != size - 1)
printf("%04d", digit[i]);
else
printf("%d", digit[i]);
}
printf("\n");
}
bigInteger operator * (int x)const{
bigInteger ret;
ret.init();
int carry = 0;
for(int i = 0;i<size;i++){
int tmp = x * digit[i] + carry;
carry = tmp / 10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if(carry != 0)
ret.digit[ret.size++] = carry;
return ret;
}
}a;
int main(int argc, const char * argv[]) {
// insert code here...
int n;
while(scanf("%d", &n) != EOF){
a.init();
a.set(1);
for(int i = 1;i <= n;i++)
a = a * i;
a.output();
}
return 0;
}
T3
进制转换
时间限制:1 秒
内存限制:32 兆
特殊判题:否 :
题目描述:将 M 进制的数 X 转换为 N 进制的数输出。
输入: 输入的第一行包括两个整数:M 和 N(2<=M,N<=36)。
下面的一行输入一个数 X,X 是 M 进制的数,现在要求你将 M 进制的数 X 转换成 N 进制的数输出。
输出: 输出 X 的 N 进制表示的数。
样例输入:
16 10
F
样例输出:
15
提示: 输入时字母部分为大写,输出时为小写,并且有大数据。
//
// main.cpp
// BigBinaryConversion
//
// Created by Apple on 2019/8/20.
// Copyright © 2019 Apple_Lance. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxDigits 100
struct bigInteger{
int digit[maxDigits];
int size;
void init(){
for(int i = 0;i<maxDigits;i++)
digit[i] = 0;
size = 0;
}
void set(int x){
init();
do{
digit[size++] = x % 10000;
x /= 10000;
}while(x != 0);
}
void output(){
for(int i = size - 1;i >= 0;i--){
if(i != size - 1)
printf("%04d", digit[i]);
else
printf("%d", digit[i]);
}
printf("\n");
}
bigInteger operator* (int x) const{
bigInteger ret;
ret.init();
int carry = 0;
for(int i = 0;i < size;i++){
int tmp = digit[i]*x + carry;
carry = tmp / 10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if(carry != 0)
ret.digit[ret.size++] = carry;
return ret;
}
bigInteger operator + (const bigInteger &A)const{
bigInteger ret;
ret.init();
int carry = 0;
for(int i = 0;i < size || i < A.size;i++){
int tmp = digit[i] + A.digit[i] + carry;
carry = tmp / 10000;
tmp %= 10000;
ret.digit[ret.size ++ ] = tmp;
}
if(carry != 0)
ret.digit[ret.size ++] = carry;
return ret;
}
bigInteger operator / (int x)const{
bigInteger ret;
ret.init();
int remainder = 0;
for(int i = size - 1;i >= 0;i--){
int t = (remainder * 10000 + digit[i]) / x;
int r = (remainder * 10000 + digit[i]) % x;
ret.digit[i] = t;
remainder = r;
}
ret.size = 0;
for(int i = 0;i < maxDigits;i++)
if(ret.digit[i] != 0)
ret.size = i;
ret.size ++;
return ret;
}
int operator % (int x)const{
int remainder = 0;
for(int i = size - 1;i >= 0;i--)
remainder = (remainder * 10000 + digit[i]) % x;
return remainder;
}
}a, b, c;
char str[10000];
char ans[10000];
int main(int argc, const char * argv[]) {
int m, n;
while(scanf("%d%d", &m, &n) != EOF){
scanf("%s", str);
int L = strlen(str);
a.set(0);
b.set(1);
for(int i = L - 1;i >= 0;i--){
int t;
if(str[i] >= '0' && str[i] <= '9')
t = str[i] - '0';
else
t = str[i] - 'A' + 10;
a = a + b * t;
b = b * m;
}
a.output();
int size = 0;
do{
int t = a % n;
if(t >= 10)
ans[size++] = t - 10 + 'a';
else
ans[size++] = t + '0';
a = a / n;
}while(a.digit[0] != 0 || a.size != 1);
for(int i = size - 1;i>=0;i--)
printf("%c", ans[i]);
printf("\n");
}
return 0;
}