| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 426 人关注过本帖
标题:高精度加法~~~
只看楼主 加入收藏
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
结帖率:82.35%
收藏
已结贴  问题点数:10 回复次数:9 
高精度加法~~~
#include<stdio.h>
#include<string.h>
main()
{
   int a[100]={0},b[100]={0},c[100]={0};
   char s[101];
   int n1=0 ,n2=0,max=0,i=0,e=0;
   gets(s);
   n1=strlen(s);
   for(i=n1-1;i>=0;i--)
    a[n1-1-i]=s[i]-'0';//将读入的s[i]转化为整形数组,并且倒序
   gets(s);
   n2=strlen(s);
   for(i=n2-1;i>=0;i--)
        b[n2-1-i]=s[i]-'0';//将读入的s[i]转化为整形数组,并且倒序
   if(n1>n2)
    max=n1;
   else max=n2;
   for(i=0;i<=max;i++){
    c[i]=(a[i]+b[i]+e)%10;
    e=(a[i]+b[i]+e)/10;//计算高精度加法
   }
   if(c[max]>0)
    printf("%d",c[max]);//判断c[max]是否应该进位
   for(i=max-1;i>0;i--)
    printf("%d",c[i]);

}
搜索更多相关主题的帖子: include 
2013-12-06 11:19
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
收藏
得分:0 
大家一起交流交流高精度的算法~~~~~~~
2013-12-06 11:20
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
晒代码???

DO IT YOURSELF !
2013-12-06 11:35
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
晒~~~

三十年河东,三十年河西,莫欺少年穷!
2013-12-06 12:10
so_love
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:7
帖 子:812
专家分:4151
注 册:2013-11-25
收藏
得分:0 
晒。。。

一花一世界、一叶一追寻、片片花叶落、情系何人身。
2013-12-06 12:27
daring_star
Rank: 2
等 级:论坛游民
帖 子:38
专家分:65
注 册:2013-10-20
收藏
得分:0 
吃多了,就回家

一如大学深似海,从此节操是路人。
2013-12-06 12:33
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:7 
//程序实现两个任意长度数字相乘
#include<stdio.h>
#include<string.h>
int main()
{
    int n,m,nn,mm,i,j,t,k1,k2,n_1,n_2,temp,count,flag;
    char str1[1000];
    char str2[1000];
loop_1:    printf("请输入第一个1000位以内的数字:");
    gets(str1);
    int N=strlen(str1);
    for(i=0,j=0,n=0,nn=0;i<N;i++)
    {
        if(str1[i]<'0'||str1[i]>'9')
        {
            printf("输入错误!请输入一串数字!\n");
            goto loop_1;
        }
        else
        if(str1[i]=='0')
        n++;
        else
        for(;j<1;j++)
        nn=n;
    }
loop_2:    printf("请输入第二个1000位以内的数字:");
    gets(str2);
    int M=strlen(str2);
    for(i=0,j=0,m=0,mm=0;j<M;j++)
    {
        if(str2[j]<'0'||str2[j]>'9')
        {
            printf("输入错误!请输入一串数字!\n");
            goto loop_2;
        }
        else
        if(str2[j]=='0')
        m++;
        else
        for(;i<1;i++)
        mm=m;
    }
    if(nn==0&&str1[0]=='0')
    N=1;
    if(mm==0&&str2[0]=='0')
    M=1;
    if(N==1&&M==1)//一位数乘一位数单独列出
    {
        if(str1[0]<str2[0])
        temp=str1[0],str1[0]=str2[0],str2[0]=temp;
        printf("两数相乘过程如下:\n");
        printf("  %c\n",str1[0]);
        printf("* %c\n",str2[0]);
        printf("---\n");
        n_2=(str1[0]-48)*(str2[0]-48);
        if(n_2<10)
        printf("  %d\n",n_2);
        else
        printf(" %d\n",n_2);
        return 0;
    }
    N=N-nn;
    M=M-mm;
    char num_1[N+M];//第一个数(数组后半段)
    char num_2[N+M];//第二个数(数组后半段)
    char num_3[M][N+M];//保存中间数
    int num_4[N+M];//保存结果
    memset(num_1,' ',sizeof(num_1));//初始化各数组
    memset(num_2,' ',sizeof(num_2));
    memset(num_3,' ',sizeof(num_3));
    memset(num_4,0,sizeof(num_4));
    if(N<M)//第一串比第二串短
    {
        temp=N;//交换后,N为长数的位数,M为短数的位数
        N=M;
        M=temp;
        for(i=M;i<N+M;i++)//给第一个数赋值较长串
        num_1[i]=str2[i-M+mm];
        for(i=N;i<N+M;i++)//给第二个数赋值较短串
        num_2[i]=str1[i-N+nn];
    }
    else//第一串比第二串长
    {
        for(i=M;i<N+M;i++)//给第一个数赋值较长串
        num_1[i]=str1[i-M+nn];
        for(i=N;i<N+M;i++)//给第二个数赋值较短串
        num_2[i]=str2[i-N+mm];
    }
    num_2[N-2]='*';//确定'*'的位置
    printf("两数相乘过程如下:\n");
    for(i=0;i<N+M;i++)//打印第一个数
    printf("%c",num_1[i]);
    printf("\n");
    for(i=0;i<N+M;i++)//打印'*'和第二个数
    printf("%c",num_2[i]);
    printf("\n");
    for(i=0;i<N+M;i++)//打印下划线
    printf("-");
    printf("\n");
    num_1[M-1]='0';//用于最后一位进位计算
    for(i=0;i<M;i++)//开始相乘
    for(j=0,flag=0;j<N+1;j++)//第二个数的每位(由低位向高位)与第一个数相乘
    {
        n_1=(num_2[N+M-1-i]-48)*(num_1[N+M-1-j]-48)+flag;//每位分别相乘并进位
        if(j==N&&flag==0)
        num_3[i][N+M-1-i-j]=' ';//防止首位打印0
        else
        num_3[i][N+M-1-i-j]=n_1%10+48;//向二维数组中保存计算过程
        flag=n_1/10;//获取进位标志
    }
    for(i=0,flag=0;i<N+M;i++)
    {
        for(j=0;j<M;j++)
        if(num_3[j][N+M-1-i]!=' ')
        num_4[N+M-1-i]+=num_3[j][N+M-1-i]-48;//列元素相加
        num_4[N+M-1-i]+=flag;
        flag=num_4[N+M-1-i]/10;//获取进位标志
        if(i==N+M-1&&num_4[N+M-1-i]==0)
        num_4[N+M-1-i]=' ';//防止首位打印0
        else
        num_4[N+M-1-i]%=10;//保存结果
    }
    for(i=N,k2=0;i<N+M;i++)//计算第二个数非0的个数
    if(num_2[i]!='0')
    k2++;
    if(k2!=1)//只有一行则不打印,超过一行才打印
    for(i=0,flag=0;i<M;i++)//打印计算过程
    {
        for(j=0;j<N+M;j++)
        if(num_3[i][j]!='0'&&num_3[i][j]!=' ')//一旦发现此行有数字则跳出循环
        {
            flag=1;
            break;
        }
        if(flag==1)
        {
            for(j=0;j<N+M;j++)//打印有数字的行
            printf("%c",num_3[i][j]);
            printf("\n");
            flag=0;//标志还原
        }
    }
    if(k2!=1&&k2!=0)//超过两行才打印下划线
    {
        for(i=0;i<N+M;i++)
        printf("-");
        printf("\n");
    }
    if(k2!=0)//有非0的数字则打印结果
    for(i=0;i<N+M;i++)//打印结果
    {
        if(i==0&&num_4[i]==' ')
        printf(" ");//防止首位打印0
        else
        printf("%d",num_4[i]);
    }
    else//全是0则打印一个0
    {
        for(i=0;i<N+M-1;i++)
        printf(" ");
        printf("0");
    }
    printf("\n\n");
    return 0;
}
测试:
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

小小战士,战士中的战斗机!
2013-12-06 12:50
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
收藏
得分:0 
回复 6楼 daring_star
大家一起交流,什么叫吃多了~~~汗~~~
2013-12-07 10:26
缔造圣者
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-12-7
收藏
得分:0 

古之立大事者,不惟有超世之才,亦必有坚韧不拔之志!
2013-12-07 14:42
limt
Rank: 1
等 级:新手上路
帖 子:1
专家分:3
注 册:2013-12-9
收藏
得分:3 
//高精度乘法
#include <stdio.h>  
#include<string.h>  
int main()  
{  
    int i,ai=1,bi=1,an,bn,fa=1,fb=1,k,j;   
    int a1[10000+1]={0},a2[10000+1]={0},c[10000+1]={0};  
    char b1[10000],b2[10000];  
  
    scanf("%s %s",&b1,&b2);  
    an=strlen(b1);  
    bn=strlen(b2);  
    for (i=10000;i>10000-an;i--,ai++)  
        a1[i]=b1[an-ai]-'0';  
    for (i=10000;i>10000-bn;i--,bi++)   
        a2[i]=b2[bn-bi]-'0';  
  
    k=0;  
    for (i=10000;i>10000-bn;i--)  
    {  
        k+=1;  
        for (j=10000;j>10000-an;j--)  
        {  
            c[j-k+1]+=a1[j]*a2[i];  
            c[j-k]+=c[j-k+1]/10;  
            c[j-k+1]=c[j-k+1]%10;     
        }  
    }  
    k=10000;  
    for (i=1;i<=10000;i++)  
        if (c[i]!=0)  
        {  
            k=i;  
            break;  
        }  
    for(i=k;i<=10000;i++) printf("%d",c[i]);  
    printf("\n");  
    return 0;  
}
2013-12-09 15:36
快速回复:高精度加法~~~
数据加载中...
 
   



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

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