大数运算-待整理

本文介绍了一个用于解决PAT-A1024回文数问题的C++程序实现,包括大数加法、数组逆置及回文数判断等关键步骤。通过对输入的两个大整数进行加法运算并判断其结果是否为回文数,实现了对特定数学问题的有效解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
FileName:PAT-A1024.Palindromic Number
Author:3stone
Date:2017.2.13
*/

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
#define maxSize 1000
#define caseSize 25//数据 组数
#define ascii_0 48

using namespace std;

int getMax(int a, int b) {
    if (a > b) return a;
    else return b;
}

void reverseArray(int a[], int b[],int len) {//获取逆置数组
    for (int i = 0; i < len; i++)
        b[len - i - 1] = a[i];
}

int judgePal(int a[],int alen) {
    //判断是否为回文数
    int i = 0, j = alen - 1;
    while (i < j) {
        if (a[i] != a[j])
            return 0;
        i++;
        j--;
    }
    return 1;
}

//大数乘法【一大一小,数组已逆置】
/*
void big_mul(int a[], int n,int & len) {
    //大数乘法【一大一小】要求输入的数组 已是倒序
    int i, sum = 0, carry = 0;
    for (i = 0; i < len; i++) {
        sum = a[i] * n + carry;//部分和
        a[i] = sum % 10;
        carry = sum / 10;
    }
    while (carry) {//处理最后的进位
        a[i++] = carry % 10;
        carry /= 10;
        len++;//warning:位数增长
    }
}
*/

//大数加法【数组已逆置】
void big_add(int a[], int b[], int & len) {//大数加法
    int carry = 0, sum = 0;
    for (int i = 0; i < len; i++) {
        sum = a[i] + b[i] + carry;
        a[i] = sum % 10;//结果
        carry = sum / 10;//进位
    }
    if (carry)//最高位进位
        a[len++] = carry;
}


void myInput(int a[], int b[],int c[], int& alen,int& blen, int & clen) {
    //处理数据
    string str;

    cin >> str;
    alen = str.size();
    reverse(str.begin(), str.end());
    for (int i = 0; i < alen; i++) {//转为数字 数组表示
        a[i] = str[i] - ascii_0;
        c[i] = a[i];
    }
    clen = alen;

    cin >> str;
    blen = str.size();
    reverse(str.begin(), str.end());
    for (int i = 0; i < blen; i++)//转为数字 数组表示
        b[i] = str[i] - ascii_0;
}

void myPrint(int a[], int b[], int c[],int alen,int blen,int clen) {
    //倒序输出
    for (int i = alen - 1; i >= 0; i--)
        cout << a[i];
    cout << " + ";
    for (int i = blen - 1; i >= 0; i--)
        cout << b[i];
    cout << " = ";
    for (int i = clen - 1; i >= 0; i--)
        cout << c[i];
    cout << endl;
}

int main() {
    int len;
    int a[caseSize][maxSize], b[caseSize][maxSize], c[caseSize][maxSize];
    int alen[caseSize], blen[caseSize], clen[caseSize], i, caseNum;
    memset(a, 0, sizeof(a));//初始化
    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));
    memset(alen, 0, sizeof(alen));
    memset(blen, 0, sizeof(blen));
    memset(clen, 0, sizeof(clen));

    cin >> caseNum;//组数
    for (int k = 0; k < caseNum; k++) {
        myInput(a[k], b[k], c[k], alen[k], blen[k], clen[k]);//处理数据
        len = getMax(alen[k], blen[k]);
        big_add(a[k], b[k], len);//相加
    }
    int k;
    for (k = 0; k < caseNum - 1; k++) {
        cout << "Case " << k + 1 << ":" << endl;
        myPrint(c[k], b[k], a[k], clen[k], blen[k], alen[k]);//输出
        cout << endl;
    }

    cout << "Case " << k + 1 << ":" << endl;
    myPrint(c[k], b[k], a[k], clen[k], blen[k], alen[k]);//输出最后一行
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值