| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 910 人关注过本帖
标题:关于大整数运算,帮忙看下哪里出错了~~(上次的错误以纠正,又有新问题!)
取消只看楼主 加入收藏
v943761
Rank: 2
等 级:论坛游民
帖 子:42
专家分:15
注 册:2009-3-4
收藏
 问题点数:0 回复次数:7 
关于大整数运算,帮忙看下哪里出错了~~(上次的错误以纠正,又有新问题!)
这是一个大整数的加法,运行后,后面的位数有时都正确(应该跟输入的位数有关),就是最前面的三位数的位置乱了。
#include <stdio.h>
#include <string.h>
#define N 200
int change(char str[],int d[])      //字符串转换为整形
{
    int i,j,len=strlen(str);
    j=N-1;
    for(i=0;i<N-1;i++)
        d[i]=0;
    for(i=len-1;i-3>=0;i-=4)
        d[j--]=(str[i-3]-'0')*1000+(str[i-2]-'0')*100+(str[i-1]-'0')*10+(str[i]-'0');
    if(i==0)
        d[j--]=str[i]-'0';
    if(i==1)
        d[j--]=(str[i]-'0')*10+(str[i-1]-'0');
    if(i==2)
        d[j--]=(str[i]-'0')*100+(str[i-1]-'0')*10+(str[i-2]-'0');
    return j+1;
}
void change2(char th[],int k,int c[])        //整形转换为字符串
{
    int i,len;
    char s[10];
    char temp;
    sprintf(th,"%d",c[k]);
    for(i=k+1;i<N;i++)
    {        
        sprintf(s,"%d",c[i]);
        strcat(th,s);
    }
}
void add(char st1[],char st2[],char st[])        //乘法
{
    int a[N],b[N],c[N];
    int i,x=0,k1,k2,k,re=0;
    if (strlen(st1)==0)
    {
        strcpy(st,st2);
        return;
    }
    if (strlen(st2)==0)
    {
        strcpy(st,st1);
        return;
    }
    k1=change(st1,a);
    k2=change(st2,b);
    k=k1<k2?k1:k2;
    for(i=N-1;i>=k;i--)
    {
        x=a[i]+b[i]+re;
        c[i]=x%10000;
        re=x/10000;
    }
    if(re>0)
    {
        k--;
        c[i]=re;
    }
    change2(st,k,c);
}
int main()
{
    char st1[N],st2[N],st[N];
    scanf("%s%s",st1,st2);
    add(st1,st2,st);
    printf("%s",st);
    return 0;
}

[ 本帖最后由 v943761 于 2010-10-20 19:32 编辑 ]
搜索更多相关主题的帖子: 整数 运算 
2010-10-19 23:00
v943761
Rank: 2
等 级:论坛游民
帖 子:42
专家分:15
注 册:2009-3-4
收藏
得分:0 
来人帮忙看下~~
2010-10-20 12:16
v943761
Rank: 2
等 级:论坛游民
帖 子:42
专家分:15
注 册:2009-3-4
收藏
得分:0 
回复 3楼 l302889153
大整数就是位数比较长的,比如位数超过100位的整数
2010-10-20 18:04
v943761
Rank: 2
等 级:论坛游民
帖 子:42
专家分:15
注 册:2009-3-4
收藏
得分:0 
回复 4楼 WDMfans
我初学,“abc指令”是什么?
只要不达到最大值,一般是够的..
2010-10-20 18:09
v943761
Rank: 2
等 级:论坛游民
帖 子:42
专家分:15
注 册:2009-3-4
收藏
得分:0 
回复 7楼 WDMfans
我上面程序改了,删掉了些,现在运行后,后面的位数有时都正确(应该跟输入的位数有关),就是最前面的三位数的位置乱了。。

[ 本帖最后由 v943761 于 2010-10-20 19:32 编辑 ]
2010-10-20 19:28
v943761
Rank: 2
等 级:论坛游民
帖 子:42
专家分:15
注 册:2009-3-4
收藏
得分:0 
要从高位开始相加。。。
2010-10-20 21:35
v943761
Rank: 2
等 级:论坛游民
帖 子:42
专家分:15
注 册:2009-3-4
收藏
得分:0 
#include <stdio.h>
#include <string.h>
#define N 200
int change(char str[],int d[])
{
    int i,j,len=strlen(str);
    j=N-1;
    for(i=0;i<N-1;i++)
        d[i]=0;
    for(i=len-1;i>=0;i--)
        d[j--]=(str[i]-'0');
    return j+1;
}
void change2(char th[],int k,int c[])
{
    int i;
    char s[10];
    sprintf(th,"%d",c[k]);
    for(i=k+1;i<N;i++)
    {        
        sprintf(s,"%d",c[i]);
        strcat(th,s);
    }
}

void add(char st1[],char st2[],char st[])
{
    int a[N],b[N],c[N];
    int i,sum=0,k1,k2,k,re=0;
    if (strlen(st1)==0)
    {
        strcpy(st,st2);
        return;
    }
    if (strlen(st2)==0)
    {
        strcpy(st,st1);
        return;
    }
    k1=change(st1,a);
    k2=change(st2,b);
    k=k1<k2?k1:k2;
    for(i=N-1;i>=k;i--)
    {
        sum=a[i]+b[i]+re;
        c[i]=sum%10;
        re=sum/10;
    }
    if(re>0)
    {
        k--;
        c[i]=re;
    }
    change2(st,k,c);
}
int main()
{
    char st1[N],st2[N],st[N];
    scanf("%s%s",st1,st2);
    add(st1,st2,st);
    printf("%s\n",st);
    return 0;
}
OK了~运行全都正确,我把那个四个字符转换成一个四位的整数的语句去掉了。。
2010-10-20 22:01
v943761
Rank: 2
等 级:论坛游民
帖 子:42
专家分:15
注 册:2009-3-4
收藏
得分:0 
这一个整形数组元素只存放了一个一位数,我想进行优化,把每个数组存放一个四位数,谁能教下该怎么写吗??
2010-10-20 22:08
快速回复:关于大整数运算,帮忙看下哪里出错了~~(上次的错误以纠正,又有新问题 ...
数据加载中...
 
   



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

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