| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6668 人关注过本帖
标题:高精度加法
只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 29楼 点线面
你用:
1111
1111

试试

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-21 13:25
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
结果是9900

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-21 13:25
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void rollback(char *ScL,int length_a,int length_b)   //对于长度短的字符串前面填充零
{
    ScL[length_a+1]='\0';
    while(length_a>=0)
        {
            if(length_b>=0)
            ScL[length_a]=ScL[length_b];
            else
            ScL[length_a]='0';
            length_a--;
            length_b--;
        }

}

void Sub(char a[],char b[],char *sum,int length_a)            //减法核心
{
    int i;
    for(i=length_a-1;i>=0;i--)
     {
        sum[i] = a[i]-b[i]+sum[i];
        if( sum[i] <0)
        {
            sum[i] += +10;
            if(i>0)
            sum[i-1]--;
        }
     }
}

void prinf(char sum[],int length_a,char flag)   //输出部分
{
    int length_b;

        if(flag)
            putchar('-');

        for(length_b =0 ;sum[length_b]==0&&(length_b+1<length_a);length_b++); //处理前面零

        for(;length_b <length_a;length_b++)  //输出
        {
         printf("%d",sum[length_b]);
        }
}

int main()
{
    char a[10]={0},b[10]={0},sum[10]={0};
    int length_a,length_b;

    gets(a);
    gets(b);//获取字符串

    length_a = strlen(a),
    length_b = strlen(b);//获取字符串长度

    if(length_a  >length_b)         //两组长度对齐,前面不足补零
    {
        rollback(b,length_a-1,length_b-1);
    }
    else
    {  
        rollback(a,length_b-1,length_a-1);
        length_a = length_b;
    }

    if(strcmp(a,b)>=0)   //比加法增加了字符串
    {

        Sub(a,b,sum,length_a);
        prinf(sum,length_a,0);
    }
    else
    {
        Sub(b,a,sum,length_a);
        prinf(sum,length_a,1);
    }
    system("pause");
    return 0;

}
之前第一次发时候OK的,后期觉得还要更短就进行编辑,发觉越改越错,今次应该没有问题,
顺便将你编译器布上来

小代码,大智慧
2011-01-21 15:45
马后炮
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:156
专家分:560
注 册:2010-12-17
收藏
得分:0 
这样写不太成熟呢,加油吧

樱之雪,晓之车
2011-01-21 16:08
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
以下是引用马后炮在2011-1-21 16:08:12的发言:

这样写不太成熟呢,加油吧
你说我吗,在那个地方要成熟,请说一说

小代码,大智慧
2011-01-21 16:11
马后炮
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:156
专家分:560
注 册:2010-12-17
收藏
得分:0 
你这样只是10进制模拟(最不应该直接保存字符来参与运算),何不使用万进制呢?

樱之雪,晓之车
2011-01-21 16:54
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:0 
加入了减完为负的情况。没有验证,请帮忙看一下。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void rollback(char array[],int Len)
{
char temp;
int i;
for(i=0;i<Len/2;i++)
    temp=array[i],array[i]=array[Len-i-1],array[Len-i-1]=temp;
}

int main()
{
    char a[100],b[100],sum[100];
    int length_a,length_b,i,sign=0;
    gets(a),gets(b);//获取字符串
    length_a=strlen(a),length_b=strlen(b);
    i=strcmp(a,b);
    if(i==0) {printf("0\n");system("pause");return 0;}
      else if((length_a<length_b)||(length_a==length_b&&i<0))
             {sign=-1;strcpy(sum,a);strcpy(a,b);strcpy(b,sum);
              i=length_a;length_a=length_b;length_b=i;}
    rollback(a,length_a),rollback(b,length_b);
    for(i=0;b[i]!='\0';sum[i]=a[i]-b[i]+48,++i);
    for(;a[i]!='\0';sum[i]=a[i],++i);
    sum[i]='\0';
    for(i=0;sum[i]!='\0';++i)
       if(sum[i]<'0')
         {
          sum[i]+=10;
          sum[i+1]--;
         }
    for(--i;sum[i]=='0'&&i>0;--i)
       sum[i]='\0';
    rollback(sum,strlen(sum));
    if(sign==-1) printf("-");      
    puts(sum);
    system("pause");
    return 0;
}
2011-01-21 17:04
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
以下是引用马后炮在2011-1-21 16:54:31的发言:

你这样只是10进制模拟(最不应该直接保存字符来参与运算),何不使用万进制呢?
你的意思进行万进制加减乘除吗,觉得没有这种必要,只需要理解万进制运算法则就OK,没有必要小材大做,无论字符,还是数值,最终表达都是数字上,它们都参与数学上运算没有什么不同,只是指令安排它们做什么的

PS:我觉得科学家完全有能力做一个十进制出来,只是成本上十进制硬件比二进制硬件贵得多,所以没有必要。

[ 本帖最后由 点线面 于 2011-1-21 17:19 编辑 ]

小代码,大智慧
2011-01-21 17:13
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
回复 37楼 godbless
就是可读性太差

小代码,大智慧
2011-01-21 17:16
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
又写了一个,有问题啊
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
short int sum[1000],length=0;//sum为结果,length为位数的长短
int cmp(int a[],int b[],int a_length,int b_length){

 int i;

 if(a_length>b_length)return 1;//如果a串长度比b串长度大,返回1
 if(a_length<b_length)return -1;//如果a串长度比b串长度小,返回-1
 for(i=a_length-1;i>=0;i--){
  if(a[i]>b[i])return 1;//如果a串数值比b串数值大,返回1
  if(a[i]<b[i])return -1;//如果a串数值比b串数值小,返回-1
 }

 return 0;//如果两数相等,返回0
}
int sub(int a[],int b[],int a_length,int b_length){

 int flag,i;//flag位标记
 length=a_length;//将a的长度赋给总长度
 flag=cmp(a,b,a_length,b_length);//从cmp中获得两串信息
 if(flag==0){
  memset(a,0,sizeof(a));//将数组置0
  return 0;//返回相等标记
 }

 if(flag==1){//如果a串长度比b串长度大 或 如果a串数值比b串数值大,返回1
    //减法核心
  for(i=0;i<length;i++)

 {
   if(a[i]<b[i])
    {
    a[i+1]--;
    a[i]+=10;
    }
   a[i]=a[i]-b[i];
   while(a[length]==0)length--;//获取减去后的长度并返回1
  }
  return 1;

 }

 //end 
 if(flag==-1){//如果a串长度比b串长度小 或 如果a串数值比b串数值小,返回-1
  for(i=0;i<b_length;i++){
   if(b[i]<a[i])
    {
        b[i+1]--;
        b[i]+=10;
    }
   a[i]=b[i]-a[i];
  }
  length=b_length;
  while(a[length]==0)length--;
  return -1;
  }
}
int main(){
char a[500],b[500];//用来读入两个串
int A[500]={0},B[500]={0},i,k;
int a_length,b_length;
gets(a),gets(b);//获取两个数
a_length=strlen(a);//获取数字a的长度
b_length=strlen(b);//获取数字b的长度
for(i=0;i<a_length;i++)
A[i]=a[a_length-i]-'0';//由数组A来保存获得的a每个字符的数值
for(i=0;i<b_length;i++)
B[i]=b[b_length-i]-'0';//由数组B来保存获得的b每个字符的数值
if(cmp(A,B,a_length,b_length)==0)//判断两串是否相等
{
    printf("0\n"); //两数相等相减就等于0
    system("pause");
    return 0;//退出程序
}
k=sub(A,B,a_length,b_length);//k为标记是否为负数
if(k==-1)//判断a-b是否是负数
printf("-");//是负数就在将要打印的数字前加上负号
for(i=length-1;i>=0;i--)
printf("%d",A[i]);//打印相减后的结果,因为一开始没有将串倒置,所以倒着输出
system("pause");
return 0;
}


欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-21 18:15
快速回复:高精度加法
数据加载中...
 
   



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

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