| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2796 人关注过本帖
标题:超大数减法问题
只看楼主 加入收藏
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
结帖率:92.86%
收藏
已结贴  问题点数:20 回复次数:6 
超大数减法问题
我最近在做ACM入门题,其中超大数问题是我第一个遇到的题目,为了从基本开始我挑了一个减法题,下面是我写的程序,问题是为什么输出来的值和输进去的值总隔了一行,而且我用小数减去大数,负号就在多出来的一行里,求高手指教。
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
    void minus(char x[],char y[]);
    char a[1000],b[1000];
    gets(a);
    gets(b);
    minus(a,b);
    printf("\n");
    return 0;
}
void minus(char x[],char y[])
{
    int i,j;
    char z[1000],a[1000]={'\0'},b[1000]={'\0'},c[1000];
    if(strlen(x)<strlen(y))
    {
        strcpy(c,x);
        strcpy(x,y);
        strcpy(y,c);
        printf("-");
    }
    else if(strlen(x)==strlen(y))
    {
        if(strcmp(x,y)<0)
    {
        strcpy(c,x);
        strcpy(x,y);
        strcpy(y,c);
        printf("-");
    }
    }
    for(i=1000-strlen(x),j=0;i<1000;i++,j++)
        a[i]=x[j];
    for(i=1000-strlen(y),j=0;i<1000;i++,j++)
        b[i]=y[j];
    for(i=999;i>=999-strlen(x);i--)
    {
        if(b[i]=='\0')
            z[i]=a[i];
        else
        {
            z[i]=a[i]-b[i]+48;
        }
        if(z[i]<'0')
        {
            z[i]=z[i]+10;
            a[i-1]--;
        }
    }
    for(i=999-strlen(x);i<1000;i++)
        printf("%c",z[i]);
}

[ 本帖最后由 空白先生 于 2012-12-16 13:11 编辑 ]
搜索更多相关主题的帖子: include return 
2012-12-16 12:36
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:10 
建议测试样例数据时  从小数据开始测试  逐步增大

DO IT YOURSELF !
2012-12-16 12:49
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:10 
我测试
123
456
        667
明显负号处理这块出现了问题

而测试
456
123
-
333

时 这个不应该有负号的啊

DO IT YOURSELF !
2012-12-16 12:51
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
收藏
得分:0 
回复 3楼 wp231957
sorry,我发错代码了,把之前那个错的发上来了,容我改一下

printf("My goal is to be  good at computer")
2012-12-16 13:00
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
收藏
得分:0 
算了,改过来的那个就马马虎虎算可以用把,当然非常感谢版主的帮助

printf("My goal is to be  good at computer")
2012-12-16 14:56
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
http://www.
"A+B"
时间限制:1000 ms  |  内存限制:8196 KB
描述
求a+b的和。

输入
第一行为整数n(n<100),表示下面有n组数据。每组数据一行,分别为两个用空格隔开的数a 和 b,a、b为不超过一百位的整数。

输出
对于每组数据,输出一行,即a+b的和。

样例输入
3
1 1
260 260
11 22
样例输出
2
520
33

程序代码:
#include <stdio.h>
#include <string.h>
void format(char *a,int *n)
{
    int i = 0,j = 0,k = 0;
    bool flag = false;
    for(i = 0;i<*n;i++)
        if(a[i]!='0' || flag)
        {
            a[k++] = a[i];
            flag = true;
        }
    if(!flag)
    {
        memset(a,0,*n);
        *n = 1;
        return;
    }
    memset(a+k,0,*n);
    i = 0;j = k-1;*n = k;
    while(i<=j)
    {
        char t = a[i]-48;
        a[i] = a[j]-48;
        a[j] = t;
        i++;j--;
    }
}
void add(char *a,int *an,char *b,int bn)
{
    int i,j,low = 0;
    int max = *an>bn?*an:bn;
    char t[205] = {0};
    for(i = 0;i<max;i++)
    {
        t[i] = a[i]+b[i]+low;
        low = t[i]/10;
        t[i] %= 10;
    }
    if(low)
        t[i++] = low;
    for(j = 0;j<i;j++)
        a[j] = t[j];
    *an = i;
}
void sub(char *a,int *an,char *b,int bn)
{
    int i,j,k,low = 0;
    char t[205] = {0};
    for(i = 0;i<*an;i++)
    {
        t[i] = a[i]-b[i]-low;
        if(t[i]<0)
        {t[i]+=10;low = 1;}
        else low = 0;
    }
    for(i = *an-1;i>=0;i--)
        if(t[i])break;
    *an = i+1;
    for(;i>=0;i--)
        a[i] = t[i];
}
int cmp(char *a,int an,char *b,int bn)
{
    if(an != bn)
        return an>bn?1:-1;
    int i = 0;
    for(i = 0;i<an;i++)
        if(a[i]>b[i])
            return 1;
        else if(a[i]<b[i])
            return -1;
    if(i == an)
        return 0;
}
void output(char *a,int an,bool flag)
{
    if(*a == 0 && an == 1)
    {
        printf("0\n");
        return ;
    }
    if(flag) putchar('-');
    for(int i = an-1;i>=0;i--)
        putchar(a[i]+48);
    printf("\n");
}
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        char a[205] = {0},b[205] = {0};
        scanf("%s%s",a,b);
        int lena = strlen(a);
        int lenb = strlen(b);
        if(a[0] == '-' && b[0] == '-')
        {
            lena--;lenb--;
            format(a+1,&lena);
            format(b+1,&lenb);
            add(a+1,&lena,b+1,lenb);
            output(a+1,lena,1);
        }
        else if(a[0] == '-' && b[0] != '-')
        {
            lena--;format(a+1,&lena);
            format(b,&lenb);
            if(cmp(a+1,lena,b,lenb)>0)
            {
                sub(a+1,&lena,b,lenb);
                output(a+1,lena,1);
            }
            else if(cmp(a+1,lena,b,lenb)<0)
            {
                sub(b,&lenb,a+1,lena);
                output(b,lenb,0);
            }
            else
                printf("0\n");            
        }
        else if(a[0] != '-' && b[0] == '-')
        {
            lenb--;format(b+1,&lenb);
            format(a,&lena);
            if(cmp(b+1,lenb,a,lena)>0)
            {
                sub(b+1,&lenb,a,lena);
                output(b+1,lenb,1);
            }
            else if(cmp(b+1,lenb,a,lena)<0)
            {
                sub(a,&lena,b+1,lenb);
                output(a,lena,0);
            }
            else
                printf("0\n");
        }
        else
        {
            format(a,&lena);
            format(b,&lenb);
            add(a,&lena,b,lenb);
            output(a,lena,0);
        }
    }
    return 0;
}

/*
4634524375297459324759793457
-324759237459234509734275987
*/

                                         
===========深入<----------------->浅出============
2012-12-16 17:28
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
加减法都有了  楼主自己看

                                         
===========深入<----------------->浅出============
2012-12-16 17:29
快速回复:超大数减法问题
数据加载中...
 
   



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

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