| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5128 人关注过本帖
标题:两个大数相加
取消只看楼主 加入收藏
ls120535021
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-11-8
收藏
 问题点数:0 回复次数:1 
两个大数相加
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream.h>
#define MAX 400
void my_read(int *a) //对操作数进行处理(倒序排列数组,便于运算)
{
    int len,i,flag=0;
    char s[MAX];
aa:
    while(1)
    {
        scanf("%s",&s);
        len=strlen(s);
        if (s[0]=='-'){
            printf("输入错误:操作数不为负数");
            goto aa;
        }
        for(i=len;i>=1;i--)
        {
            if ((s[len-i]-'0')<0||(s[len-i]-'0')>9)
            {
                printf("\t\t\t你输入的第%d位不合法,按任意键重新输!!",len-i+1);
                getchar();
                goto aa;
            }
            else
                a[i]=s[len-i]-'0';
        }
        a[0]=len;
        break;
    }
    return;
}

void my_print(int *a) //输出时把数组倒过来就是答案
{
    int i;
    if (a[0]<0) printf("-");
    if (a[0]==0)
    {
        printf("0");
        return;
    }
    for(i=abs(a[0]);i>=1;i--)
        printf("%d",a[i]);
    printf("\n");
}

void format(int *a) //当两个字符相加时超过10时
{
    int p;
    for(p=1;p<a[0]||a[p]>=10;p++)
    {
        if (p>=a[0]) a[p+1]=0;
        a[p+1]+=a[p]/10;
        a[p]=a[p]%10;
    }
    if (p>=a[0]) a[0]=p;
    return;
}
void add(int *a,int *b,int *c) //加法的运算
{
    int len,i;
    if (a[0]<b[0]) len=a[0];
    else len=b[0];
    for(i=1;i<=len;i++)
        c[i]=a[i]+b[i];
    if (len<a[0])
    {
        for (;i<=a[0];i++)
            c[i]=a[i];
        c[0]=a[0];
    }
    else
    {
        for(;i<=b[0];i++)
        {
            c[i]=b[i];
        }
        c[0]=b[0];
    }
    format (c);
}



void format1(int *a) //减法 相减为负时
{
    int i;
    for (i=1;i<=a[0];i++)
        if (a[i]<0)
        {   
            a[i]+=10;
            a[i+1]-=1;
        }
}

void sub_1(int *a,int *b,int *c)  
{
    int i;
    for (i=1;i<=b[0];i++)
        c[i]=a[i]-b[i];
    if (a[0]==b[0]) goto loop;
    for (;i<=a[0];i++)
        c[i]=a[i];
loop:
    c[0]=a[0];
    format1(c);
    i=c[0];
    while(1)
        if (c[i]==0) i--;
        else break;
        c[0]=i;
        return;
}


void sub(int *a,int *b,int *c)
{
    int i,flag=0;
    for (i=1;i<=a[0];i++)
        if (a[i]!=b[i]) { flag=1; break; }
        if (flag==0) {
            c[0]=0;
            return;
        }
        flag=0;
        if (a[0]==b[0]) {
            i=a[0];
            while(i>0)
            {
                if (a[i]>b[i]){
                    sub_1(a,b,c);
                    break;
                }
                if (a[i]<b[i]){
                    flag=1;
                    sub_1(b,a,c);
                    break;
                }
                i--;
            }
        }
        if (a[0]>b[0])
            sub_1(a,b,c);
        else
            if (a[0]<b[0])
            {
                flag=1;
                sub_1(b,a,c);
            }
            if (flag)
                c[0]=-c[0];
            else
                c[0]=c[0];
}
void main()
{
    int a[MAX],b[MAX],c[MAX];
    char yn,eq;



strat:   printf("请输入表达式(操作数和操作符之间需空格):\n");
         my_read(a);
         scanf("%s",&yn);
         my_read(b);
         scanf("%s",&eq);
         if (yn=='+'&&eq=='=')
         {
             add(a,b,c);
             printf("\n\t\t\t");
             printf("A=");
             my_print(a);
             printf("\n\t\t\t");
             printf("B=");
             my_print(b);
             printf("\n\t\t\t");
             printf("C=A+B=");
             my_print(c);
             goto loop;
         }
         if (yn=='-'&&eq=='=')
         {
             sub(a,b,c);
             printf("A=");
             my_print(a);
             printf("\nB=");
             my_print(b);
             printf("\nC=A-B=");
             my_print(c);
             goto loop;
         }
         else{ printf("输入错误");
         goto loop;
         }
loop:
         while(1)
         {
             printf("\n\t\t\t继续计算吗?(y/n)");
             yn=getchar();
             if (yn=='y') goto strat;
             if (yn=='n') return;
         }
}   
这个输入的时候运算符左右需加空格(比如1 + 1 =),如果我不想加空格(1+1=),那要怎么办?谢谢啦
搜索更多相关主题的帖子: 大数 相加 
2007-12-17 21:51
ls120535021
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-11-8
收藏
得分:0 
谢谢两位了 ,唉,学了一个学期了竟然连这都不会,请问 有什么好的方法?
2007-12-18 10:20
快速回复:两个大数相加
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017270 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved