| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 690 人关注过本帖
标题:关于大数加法的,进位出了点问题。。
取消只看楼主 加入收藏
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:1 
关于大数加法的,进位出了点问题。。
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 1024
#define ADD     1
#define SUBTRCT 2

int handel(char* str)
{
  int i=0;
  int j=strlen(str);
  while(i<j){
    ++i;
    if(str[i]== '+')
      return ADD;
    else if(str[i] == '-')
      return SUBTRCT;

  }
}


void before_afte_add(char* str1,char** str2)
{
  int i=0,k=0,j;
  while(str1[i]!= '+')
    i++;
    j = i;
  while(str1[--i]== ' ')
       ;
  str1[i+1]='\0';
  while(str1[++j]== ' ')
    ;
  *str2 = str1+(j);
}

void before_afte_sub(char* str1,char** str2)
{
  int i=0,k=0,j;
  while(str1[i]!= '-')
    i++;
    j = i;
  while(str1[--i]== ' ')
       ;
  str1[i+1]='\0';
  while(str1[++j]== ' ')
    ;
  *str2 = str1+(j);
}


void reverse(char* str, int n)
{
  int i,j;
  char temp;

  for(i=0, j=n-1; i<j; i++, j--)
    temp=str[i], str[i]=str[j],str[j]=temp;
}


void add(char* str)                                                              /*主要是这里面的*/
{
  int i,len1,len2;
  char str1[MAXLINE];
  char *str2;
  strcpy(str1,str);
  before_afte_add(str1,&str2);
  len1=strlen(str1);
  len2=strlen(str2);
  reverse(str1, len1);
  reverse(str2, len2);                                                           /*len1是数组str1的长度   len2是数组2长度   reverse是用来把数组前后的调转的*/
  if(len1<=len2){                                                                /*主要问题是下面的*/
    for(i=0; i<len1; i++){
      str2[i]+=str1[i]-'0';
      if(str2[i]>'9' && i<len2-1)
        str2[i]-=10, str2[i+1]++;
      }
    if(str2[len2-1]>'9')
      str2[len2-1]-=10,str2[len2]='1', str2[len2+1]='\0';
    reverse(str2,strlen(str2));
    printf("%s\n",str2);
  }
  else {
    for(i=0; i<len2; i++){
      str1[i]+=str2[i]-'0';
      if(str1[i]>'9')
        str1[i]-=10, str1[i+1]++;
    }
    reverse(str1, strlen(str1));
    printf("%s", str1);
  }
}

void subtrct(char* str)
{

}


int main()
{
  int n, m = 0;
  char str[MAXLINE];
  gets(str); 

  switch(handel(str)){
  case ADD:
  add(str);
  break;
  case SUBTRCT:
  subtrct(str);
  break;
  }
}

这个程序运行时是如果输入了465465465456456    +     6546546546546544  输出前部分加后部分的值。
其他加数都没什么问题。。。不过一到999+1这样就出问题了。。。。本来应该是1000  由于进位不知道该怎么弄   变9:0了。。求高手指教指教


程序代码:
void add(char* str)
{
  int i,len1,len2;
  char str1[MAXLINE];
  char *str2;
  strcpy(str1,str);
  before_afte_add(str1,&str2);
  len1=strlen(str1);
  len2=strlen(str2);
  reverse(str1, len1);
  reverse(str2, len2);                                   /*  str1是数组1,str2是数组2  len1是数组1长度  len2是数组2长度    帮我看看下面加法运算有什么问题,输入999+1就出错了改要怎么改   */
  if(len1<=len2){
    for(i=0; i<len1; i++){
      str2[i]+=str1[i]-'0';
      if(str2[i]>'9' && i<len2-1)
        str2[i]-=10, str2[i+1]++;    

    }
    if(str2[len2-1]>'9')
      str2[len2-1]-=10,str2[len2]='1', str2[len2+1]='\0';
    reverse(str2,strlen(str2));
    printf("%s\n",str2);
  }
  else {
    for(i=0; i<len2; i++){
      str1[i]+=str2[i]-'0';
      if(str1[i]>'9')
        str1[i]-=10, str1[i+1]++;
    }
    if(str1[len1-1]>'9')
      str1[len1-1]-=10,str1[len1]='1',str1[len1+1]='\0';
    reverse(str1, strlen(str1));
    printf("%s", str1);
  }
}


[ 本帖最后由 clcqifeng 于 2012-3-7 17:57 编辑 ]
搜索更多相关主题的帖子: 问题 1024 
2012-03-07 17:29
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 2楼 有容就大
主要是add那里面的str1是数组1   str2是数组2    len1是数组1长度   len2是数组2长度
revese是把数组里面的头尾调转·方便加法运算
2012-03-07 18:05
快速回复:关于大数加法的,进位出了点问题。。
数据加载中...
 
   



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

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