把一个数当成一个字符串进行运算
大数相加:
#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;
}