您的位置:首页 > 编程语言 > C语言/C++

大数运算模板(C语言)

2016-07-20 22:08 543 查看
代码说明:

//大数相加
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN+10];
int an2[MAXN+10];
char str1[MAXN+10];
char str2[MAXN+10];
int main()
{
memset(an1,0,sizeof(an1));
int i,j;
scanf("%s",str1);
j=0;
int len1=strlen(str1);
for(i=len1-1;i>=0;i--)
an1[j++]=str1[i]-'0';
while(~scanf("%s",str2)&&str2[0]!='0')
{
memset(an2,0,sizeof(an2));
j=0;
int len2=strlen(str2);
for(i=len2-1;i>=0;i--)
an2[j++]=str2[i]-'0';
//下面是主要运算过程
for(i=0;i<MAXN;i++){
an1[i]+=an2[i];
if(an1[i]>=10){
an1[i]-=10;
an1[i+1]++;
}
}
//输出
int pan_0 = 0;
for(i=MAXN;i>=0;i--){
if(pan_0)
printf("%d",an1[i]);
else if(an1[i]){
printf("%d",an1[i]);
pan_0 = 1;
}
}
printf("\n");
}
return 0;
}
//大数相减
//改动主要运算过程
for(i=0;i<MAXN;i++){
an1[i]-=an2[i];
if(an1[i]<0){
an1[i]+=10;
an1[i+1]--;
}
}

//大数相乘
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN*2+10];
int an2[MAXN+10];
int aresult[MAXN*2+10];
char str1[MAXN+10];
char str2[MAXN+10];
int main()
{
memset(an1,0,sizeof(an1));
int i,j;
scanf("%s",str1);
j=0;
int len1=strlen(str1);
for(i=len1-1;i>=0;i--)
an1[j++]=str1[i]-'0';
int duandian;
duandian=len1-1;
while(~scanf("%s",str2)&&str2[0]!='0')
{
memset(aresult,0,sizeof(aresult));
memset(an2,0,sizeof(an2));
j=0;
int len2=strlen(str2);
for(i=len2-1;i>=0;i--)
an2[j++]=str2[i]-'0';
//下面是主要运算过程
for(i=0;i<duandian+1;i++)
for(j=0;j<len2;j++)
aresult[i+j]+=an1[i]*an2[j];
for(i=0;i<MAXN;i++){
if(aresult[i]>=10){
aresult[i+1]+=aresult[i]/10;
aresult[i]%=10;
}
}
//输出
memset(an1,0,sizeof(an1));
int pan_0 = 0;
for(i=MAXN*2;i>=0;i--){
if(pan_0){
printf("%d",aresult[i]);
an1[i]=aresult[i];
}
else if(aresult[i]){
printf("%d",aresult[i]);
duandian=i;
an1[i]=aresult[i];
pan_0 = 1;
}
}
printf("\n");
memset(str2,0,sizeof(str2));
}
return 0;
}

//大数相除,两个数
//反复做减法,能减几个,商就是几。
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN+10];           //被除数
int an2[MAXN+10];           //除数
int aresult[MAXN+10];       //商
char str1[MAXN+10];
char str2[MAXN+10];
//substract函数表示an1减去an2,返回结果的长度;不够返回-1;刚好返回0;
int subtract(int *p1,int *p2,int len1,int len2)
{
int i;
//判断p1是否比p2大,不是返回-1
if(len1<len2)
return -1;
int pan = 0;
if(len1==len2){
for(i=len1-1;i>=0;i--){
if(p1[i]>p2[i])
pan = 1;
else if(p1[i]<p2[i]){
if(!pan)
return -1;
}
}
}
//p1不小于p2,做减法
for(i=0;i<len1;i++){
p1[i]-=p2[i];
if(p1[i]<0){
p1[i]+=10;
p1[i+1]--;
}
}
for(i=len1-1;i>=0;i--)
if(p1[i])
return i+1;
//一样大
return 0;
}
int main()
{
int t;
scanf("%s",str1);
scanf("%s",str2);
int i,j;
memset(an1,0,sizeof(an1));
memset(an2,0,sizeof(an2));
memset(aresult,0,sizeof(aresult));
j=0;
int len1=strlen(str1);
for(i=len1-1;i>=0;i--)
an1[j++]=str1[i]-'0';
j=0;
int len2=strlen(str2);
for(i=len2-1;i>=0;i--)
an2[j++]=str2[i]-'0';
//运用substract函数
len1=subtract(an1,an2,len1,len2);
//情况1
if(len1<0){
printf("0\n");
}
//情况2
else if(len1==0){
printf("1\n");
}
//情况3
else
{
aresult[0]++;   //已经减了一次,商加1
int times=len1-len2;
if(times<0)     //不能再减
goto output;
else if(times>0){
for(i=len1-1;i>=0;i--){
if(i>=times)
an2[i]=an2[i-times];
else
an2[i]=0;
}
}
//!!!
len2=len1;
for(j=0;j<=times;j++){
int tmp;
while((tmp=subtract(an1,an2+j,len1,len2-j))>=0){
len1=tmp;
aresult[times-j]++;
}
}
output:
//进位
for(i=0;i<MAXN;i++){
if(aresult[i]>=10){
aresult[i+1]+=aresult[i]/10;
aresult[i]%=10;
}
}
//输出
int pan_0 = 0;
for(i=MAXN;i>=0;i--){
if(pan_0){
printf("%d",aresult[i]);
}
else if(aresult[i]){
printf("%d",aresult[i]);
pan_0 = 1;
}
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: