大数(相加+相减+相乘)

把一个数当成一个字符串进行运算
大数相加:

#include <cstdio>
#include <cstdlib>
#include <cstring>
char s1[2000];
char s2[2000];
void Add1();
int main()
{
    gets(s1);
    gets(s2);
    Add1();
    return 0;
}
void Add1()
{
    int num1[2000],num2[2000];
    memset(num1,0,sizeof(num1));
    memset(num2,0,sizeof(num2));
    int i,j;
    int len1=strlen(s1);
    int len2=strlen(s2);
    //数组中存的为字符0,把字符零转化为数字0
    for(i=len1-1,j=0; i>=0; i--)
        num1[j++]=s1[i]-'0';
    for(i=len2-1,j=0; i>=0; i--)
        num2[j++]=s2[i]-'0';
    for(i=0; i<2000; i++)
    {
        num1[i]+=num2[i];
        //进位
        if(num1[i]>9)
        {
            num1[i]-=10;
            num1[i+1]++;
        }
    }
    //去除前边多余的零,从第一个不是零的位置输出
    for( i=1999; i>=0; i--)
        if(num1[i]!=0)
            break;
    if(i==-1)
        printf("0");
    for(; i>=0; i--)
        printf("%d",num1[i]);
    printf("\n");

}

大数相减:

#include <cstdio>
#include <cstring>
char a[1005],b[1005];
void Sub();
int main()
{
    scanf("%s%s",a,b);
    Sub();
    return 0;
}
void Sub()
{
    if(a == NULL || b == NULL)
        return;
    int len1 = strlen(a);
    int len2 = strlen(b);
    //如果a<b,交换a,b
    int flag=strcmp(a,b);
    if (flag<0)
    {
        int t = len1;
        len1 = len2;
        len2 = t;
        char c[1005];
        strcpy(c,a);
        strcpy(a,b);
        strcpy(b,c);
    }
    else if (flag==0)
    {
        printf("0\n");
        return ;
    }
    int i, j;
    int num1[1005];
    int num2[1005];
    memset(num1,0,sizeof(num1));
    memset(num2,0,sizeof(num2));
    //数组中存的为字符0,把字符零转化为数字0
    for (i=len1-1,j=0; i>=0; i--)
        num1[j++] = a[i] - '0';
    for (i =len2-1,j=0; i>=0; i--)
        num2[j++]= b[i] -'0';
    for (i = 0; i < len1; i++)
    {
        num1[i] = num1[i] - num2[i];
        //借位,从下一位借“1”
        if(num1[i] < 0)
        {
            num1[i]+=10;
            num1[i+1]-=1;
        }
    }
    //去除前边多余的零,从第一个不是零的位置输出
    for (i = len1-1; i>=0; i--)
        if (num1[i])
            break;
     //如果“a<b",则计算出的结果应为负数
    if(flag==-1)
        printf("-");
    if(i >= 0)
        for (; i >= 0; i--)
            printf("%d",num1[i]);
    else
        printf("0");
}

大数相乘:

蓝桥杯 基础练习 阶乘计算
题目描述:输出n的阶乘,n<=1000。

解题思路(题意里给出):

n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
const int inf=0x3f3f3f3f;
const double pi=acos(-1);
const int mod=1e9+7;
const int N=3e3;

int main()
{

    int a[N],i,j,n;
    while (~scanf("%d",&n))
    {
        int c=0; //进位
        int s;
        memset(a,0,sizeof(a));
        a[0]=1;
        for(i=2; i<=n; i++) //乘数
        {
            for(j=0; j<N; j++)
            {
                s=a[j]*i+c;
                a[j]=s%10;
                c=s/10;
            }
        }
        for(i=N-1; i>=0; i--) //从第一个不为零的开始
            if(a[i]) break;
        for(j=i; j>=0; j--)
        {
            printf("%d",a[j]);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39535750/article/details/79152643