大数加法、大数乘法

大数加法

hdu1002

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <sstream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <iomanip>
#include <stack>

using namespace std;

typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MAXN = 1005;
const int MOD = 1e9 + 7;

#define MemI(x) memset(x, -1, sizeof(x))
#define Mem0(x) memset(x, 0, sizeof(x))
#define MemM(x) memset(x, 0x3f, sizeof(x))
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1

void Add(char a[MAXN], char b[MAXN], int alen, int blen)
{
    int len = max(alen, blen);
    int aa[MAXN] = {0}, bb[MAXN] = {0};
    for(int i = 0;i < alen;++i)
        aa[i] = a[alen - i - 1] - ‘0‘;
    for(int i = 0;i < blen;++i)
        bb[i] = b[blen - i - 1] - ‘0‘;
    int ans[MAXN];
    Mem0(ans);
    for(int i = 0;i < len;++i)
        ans[i] = aa[i] + bb[i];
    for(int i = 0;i < len;++i)
    {
        if(ans[i] > 9)
        {
            ans[i] -= 10;
            ans[i + 1]++;
        }
    }
    if(ans[len])
        len++;
    bool flag = false;
    for(int i = len - 1;i >= 0;--i)
    {
        if(ans[i] != 0)
            flag = true;
        if(flag)
            cout << ans[i];
    }
    if(!flag)
        cout << 0;
    cout << endl;
}

int main()
{
    int T;
    while(cin >> T)
    {
        for(int cas = 1;cas <= T;++cas)
        {
            char a[MAXN], b[MAXN];
            cin >> a >> b;
            if(cas != 1)
                cout << endl;
            cout << "Case " << cas << ":\n" << a << " + " << b << " = ";
            Add(a, b, strlen(a), strlen(b));
        }
    }
    return 0;
}

大数乘法

51nod 1027

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <sstream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <iomanip>
#include <stack>

using namespace std;

typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MAXN = 1005;
const int MOD = 1e9 + 7;

#define MemI(x) memset(x, -1, sizeof(x))
#define Mem0(x) memset(x, 0, sizeof(x))
#define MemM(x) memset(x, 0x3f, sizeof(x))
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1

char a[MAXN], b[MAXN];
int ans[MAXN * MAXN] = {0};
int main()
{
    cin >> a >> b;
    int alen = strlen(a), blen = strlen(b);
    for(int i = 0;i < alen >> 1;++i)
        swap(a[i], a[alen - i - 1]);
    for(int i = 0;i < blen >> 1;++i)
        swap(b[i], b[blen - i - 1]);
    for(int i = 0;i < alen;++i)
    {
        for(int j = 0;j < blen;++j)
        {
            ans[i + j] += (a[i] - ‘0‘) * (b[j] - ‘0‘);
            ans[i + j + 1] += ans[i + j] / 10;
            ans[i + j] %= 10;
        }
    }
    bool flag = false;
    for(int i = alen + blen - 1;i >= 0;--i)
    {
        if(!flag && ans[i] != 0)
            flag = true;
        if(flag)
            cout << ans[i];
    }
    if(!flag)
        cout << 0;
    cout << endl;
    return 0;
}

hdu1042

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <sstream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <iomanip>
#include <stack>

using namespace std;

typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MAXN = 100005;
const int MOD = 1e9 + 7;

#define MemI(x) memset(x, -1, sizeof(x))
#define Mem0(x) memset(x, 0, sizeof(x))
#define MemM(x) memset(x, 0x3f, sizeof(x))
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1

int main()
{
    int n, a[MAXN];
    while(cin >> n)
    {
        Mem0(a);
        int len = 0, t = 0;
        a[0] = 1;
        //万进制
        for(int i = 1;i <= n;++i)
        {
            for(int j = 0;j <= len;++j)
            {
                a[j] = a[j] * i + t;
                t = a[j] / 10000;
                a[j] %= 10000;
            }
            if(t)
            {
                a[++len] = t;
                t = 0;
            }
        }
        printf("%d", a[len]);
        for(int i = len - 1;i >= 0;--i)
            printf("%04d", a[i]);
        printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/shuizhidao/p/9643164.html

时间: 2024-10-11 20:53:18

大数加法、大数乘法的相关文章

大数加法、乘法

1 #include<iostream> 2 3 #include<stdio.h> 4 5 #include<string.h> 6 7 #define Len 3000//大数的长度 8 9 using namespace std; 10 11 int Input (char n[])//将大数读入的函数 12 13 { 14 15 char s[Len]; 16 17 int i,l; 18 19 20 21 for(i=0; i<Len; i++) n[i

大数加法和乘法

计算两个小的整形数相加的,用自带的+运算符就可以很容易的解决,但是对于两个很大的数来讲是会溢出的.用+运算符就无法完成了,当然你可以重载+运算符. 其实对于两个大整数相加,就是用到我们小学时学加法的方法-------竖式加法,一位一位的去相加,相加的和大于9只要进一位就OK了. 代码如下: #include <string.h> #include <stdio.h> const int N=100; char s1[N],s2[N]; //保存输入的两个大整数 int bign1[

大数加法乘法

大数加法乘法: 1 /* 2 2015.4 3 大数加法,乘法 4 5 */ 6 #include <iostream> 7 #include <string> 8 #include <vector> 9 10 using namespace std; 11 #define MAX 99 12 #define MAXM 200 13 14 void BigNumAdd() 15 { 16 char strA[MAX], strB[MAX]; 17 cout <&l

大数加法、减法、乘法

大数四则运算--C++实现 大数处理--c++实现 本课题来自我的c++编程作业,文章利用大数处理类,类名:hugeNumber来对大数(编译器自定义的数值类型无法处理的数)进行四则运算(大数加法.大数减法及大数乘法的运算,除暂时没实现)和按精度四舍五入,自定义科学计数法等.内容广泛涉及运算符重载.字符连接.字符加减和字符乘除等作者原创函数.重要提示:本文涉及的所有函数使用的进制皆为10进制.(备注:已将该博客搬迁至CSDN) 一.解题思路 1 核心思想 文章用hugeNumber类对大数进行操

vector、string实现大数加法乘法

理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将字串的每一个字符 s[i] 以 int 形式赋给 vector<int> a 中的每一个元素.然后将 a[i] 和 a[j] 加起来(或者乘起来).每两个元素加起来的结果 <= 18,乘起来的结果 <= 81. 用 string 实现大数加法的方法跟 vector 差不多,但是用 st

NI笔试——大数加法

NI笔试: 1.找出字符串第一次出现的字符.用数组建立哈希表,然后再扫描字符串并判断次数是否为1. 2.大数加法,即字符串加法.因为之前写过乘法,就以为是乘法.然后就把乘法写上去了····= = 好了,看一下加法的思路. 要不要太简单,用俩数组,先把字符串每个位转换成数字存到这俩数组里,然后对每一位进行加和. 代码是拿别人的.= = void Add(char s1[],char s2[]) //需要两个字符串参数&&无返回值 { int num1[M],nm2[M]; int i,j;

Hat&#39;s Fibonacci(大数加法+直接暴力)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1250 hdu1250: Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9442    Accepted Submission(s): 3096 Problem Description A Fibonacci

大数加减乘法

大数的相关计算问题一直是编程比赛常考的题目,在蓝桥杯比赛之前又把大数的加减乘法做了一遍.大数除法比较难,还没有去尝试实现,以后有机会了再继续补全好了. 算法分析:三种方法相似,都是按位操作,动态存储.处理好输入数据后,对每一位的逐个操作,很容易得到答案. 大数加法 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define MAX 1010 using n

C语言 &#183; 大数加法

算法提高 大数加法 时间限制:1.0s   内存限制:256.0MB 问题描述 输入两个正整数a,b,输出a+b的值. 输入格式 两行,第一行a,第二行b.a和b的长度均小于1000位. 输出格式 一行,a+b的值. 样例输入 42 样例输出 6 1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char a[1001],b[1001]; 6 int s[1001],d[1001]; 7 scanf("