大数处理--大数相加减问题(c语言)

在上次的期末考试中又出现了大数相加减的问题,个人认为此类问题较为基础,且有一定的难度,但网上的代码大多是c++版本,特此发个大数处理问题c语言版本。相似的如大数相乘、大数的因式、大数阶乘等问题将在后面更新。

//  HOUYI  2017.12.12
#include"stdio.h"
#include"string.h"
void add(char *p1,char *p2,int len1,int len2)   //相加
{
    int i,j,k,t=0;
    for(i=len2-1,j=len1-1; i>=0; i--,j--)//循环保证小的数大于0
    {
        k=p2[i]+p1[j]-'0'-'0'+t;//两个数对应位置的数相加并加上低位进位进的数值
        //当数值大于等于10时,取个位数
        if(k>=10)
            p1[j]=(k%10)+'0';
        else
            p1[j]=k+'0';
        t=k/10;//进位数值
    }
}
//去前导零函数
char *dislodge(char*s)  
{
    char*p=s;
    int i;
    for(i=0; s[i]!='\0'; ++i)
    {
        //数值为0的情况
        if(s[i+1]=='\0') break;
        //去掉前导0后不再该表位置
        if(s[i]!='0') break;
    }
    p=&s[i];
    return p;
}

int main()
{
    char a[205],b[205];
    int l1,l2;
    while(scanf("%s %s",a,b)!=EOF)
    {
        char *p1=a,*p2=b,*p;
        l1=strlen(a);
        l2=strlen(b);
        //大数放前面
        if(l1>l2)
        {
            add(p1,p2,l1,l2);
            p=qdao(p1);
        }
        else
        {
            add(p2,p1,l2,l1);
            p=dislodge(p2);
        }
        printf("%s\n",p);
        memset(a,0,205);
        memset(b,0,205);
    }
    return 0;
}

同样的大数相减的算法如下:

#include<stdio.h>
#include<string.h>
#include<math.h>

//大数相减函数
char * subtract(char *s1,char *s2,int l1,int l2)
{
    int i,j,t;
    for(i=l1-1,j=l2-1; j>=0; i--,j--)
    {
        t=s1[i]-s2[i];
        if(t<0)
        {
            s1[i]=abs(t)+'0';
            s1[i-1]=s1[i-1]-1;
        }
        else
            s1[i]=t+'0';
    }
    return s1;
}

//去前导零函数
char* dislodge(char *s)
{
    int i,l;
    l=strlen(s);
    for(i=0;i<l;i++)
    {
        //数值为0的情况
        if(s[i+1]=='\0');
        break;
        //当为前导0时不再改变位置
        if(s[i]!='0');
        break;
    }

    return &s[i];
}

int main()
{
    char str1[205],str2[205];
    int len1,len2;
    char *p1,*p2;
    while(scanf("%s %s",str1,str2)!=EOF)
    {
        len1=strlen(str1);
        len2=strlen(str2);
        if(len1>len2)
            p1=subtract(str1,str2,len1,len2);
            else
                p1=subtract(str2,str1,len2,len1);
            p2=dislodge(p1);
            printf("%s\n",p2);
            memset(str1,0,205);
            memset(str2,0,205);
    }
    return 0;
}

本人刚接触编程,水平有限。希望能帮助更多像我一样的初学者更快了解大数处理问题的方法。也希望各位前辈多多指出代码中的不足

阅读更多
换一批

没有更多推荐了,返回首页