| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 908 人关注过本帖
标题:关于大整数运算,帮忙看下哪里出错了~~(上次的错误以纠正,又有新问题!)
只看楼主 加入收藏
v943761
Rank: 2
等 级:论坛游民
帖 子:42
专家分:15
注 册:2009-3-4
收藏
 问题点数:0 回复次数:11 
关于大整数运算,帮忙看下哪里出错了~~(上次的错误以纠正,又有新问题!)
这是一个大整数的加法,运行后,后面的位数有时都正确(应该跟输入的位数有关),就是最前面的三位数的位置乱了。
#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
l302889153
Rank: 2
等 级:论坛游民
帖 子:66
专家分:89
注 册:2010-5-26
收藏
得分:0 
什么是大整数?
高精度整数吗?
2010-10-20 16:56
WDMfans
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:86
专家分:168
注 册:2010-9-19
收藏
得分:0 
大整数加法 用 adc指令更简单
st数组内存明显小于等于 st1 ,st2

[ 本帖最后由 WDMfans 于 2010-10-20 17:34 编辑 ]
2010-10-20 17:23
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
WDMfans
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:86
专家分:168
注 册:2010-9-19
收藏
得分:0 
程序代码:
按位直接相加,进位则ST[N+1]++
ADD(char st1[],char st2[],char st[])
{    
    int N=0;
    
    while(N<=strlen(st2)&&N<=strlen(st1))
    {   
    if((st[N]=(st1[N]+st2[N])>=97)
         { 
         st[N+1]++;
         st[N]-=58;                  
         }
    else
        st[N]=st1[N]+st2[N]-48;
    N++;
    }
   
while(N<strlen(st1))
    {
    st[N]=st1[N];
    N++ ;
    }
while(N<strlen(st2))
    {
    st[N]=st2[N];
    N++;
    }
    st[N]=0;
    //调用转换字符串转换为整数函数
}//END ADD   



[ 本帖最后由 WDMfans 于 2010-10-20 19:46 编辑 ]
2010-10-20 19:02
v943761
Rank: 2
等 级:论坛游民
帖 子:42
专家分:15
注 册:2009-3-4
收藏
得分:0 
回复 7楼 WDMfans
我上面程序改了,删掉了些,现在运行后,后面的位数有时都正确(应该跟输入的位数有关),就是最前面的三位数的位置乱了。。

[ 本帖最后由 v943761 于 2010-10-20 19:32 编辑 ]
2010-10-20 19:28
WDMfans
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:86
专家分:168
注 册:2010-9-19
收藏
得分:0 
我来编译看看
改了下
。。。 要逆序相加

[ 本帖最后由 WDMfans 于 2010-10-20 20:03 编辑 ]
2010-10-20 19:46
v943761
Rank: 2
等 级:论坛游民
帖 子:42
专家分:15
注 册:2009-3-4
收藏
得分:0 
要从高位开始相加。。。
2010-10-20 21:35
快速回复:关于大整数运算,帮忙看下哪里出错了~~(上次的错误以纠正,又有新问题 ...
数据加载中...
 
   



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

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