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

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-21 10:11
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分: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[1000],b[1000],sum[1000];
    int length_a,length_b,i;//a串的长度,b串的长度
    gets(a),gets(b);//获取字符串
    length_a=strlen(a),length_b=strlen(b);//获取a串的长度,b串的长度
    rollback(a,length_a),rollback(b,length_b);
    while(a[i]!='\0'&&b[i]!='\0')//先相加字符串
    {
    sum[i]=a[i]-b[i]-48;
    i++;
    }
    if(a[i]=='\0')
    while(b[i]!='\0')
    {
    sum[i]=a[i];
    i++;
    }
    else
    while(a[i]!='\0')
    {
        sum[i]=a[i];
        i++;
    }
    sum[i]='\0';
    for(i=0;sum[i]!='\0';i++)
    if(b[i]>a[i])
    {
    sum[i]+=10;
    if(sum[i-1]=='\0') sum[i-1]='1',sum[i-2]='\0';
    else sum[i+1]--;
    }
    rollback(sum,strlen(sum));//反转回来
    puts(sum);
    system("pause");
    return 0;
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-21 12:01
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
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
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
发现每次都会多输出一个0

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-21 18:19
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
好像不止这个问题。。。

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-21 18:51
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
我已经自己改好了,谢谢各位了

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



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

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