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

#define MAXLINE 1024
#define ADD  1
#define SUB  2
#define HELP 3

int handelargs(char* str, int n)
{
  int i = 0;
  while( i < n){
    if (str[i] == '+')
      return ADD;
    if(str[i] == '-')
      return SUB;
    ++i;
   

  }
}

void reverse(char* str, int n)
{
  int i,j;
  char temp;
  for(i=0,j=n-i-1;i<j; i++, j--)
    temp=str[i],str[i]= str[j],str[j]= temp;
}

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

/*  while(str1[++i]!= '+')
    ;
  str1[i]='\0';
  *str2 = str1+(i+1);*/
}

void add(char* str)
{
  int i,k=1,len1,len2;
  char str1[MAXLINE],*str2;
  strcpy(str1, str);
  before_afte(str1, &str2);
  len1 = strlen(str1);
  len2 = strlen(str2);
  reverse(str1, len1);
  reverse(str2, len2);
  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]++;
      while(i+k>=len1 && i+k<len2-1){
        if(str2[i+k] > '9')
          str2[i+k]-=10,str2[i+k+1]++;
        ++k;
      }
    }
    if(str2[len2-1]>'9')
      str2[len2-1]-=10,str2[len2] = '1', str2[len2+1] = '\0';
    reverse(str2,strlen(str2));
    printf("%s",str2);
  }
  else{
    for(i=0;i<len2;i++){
      str1[i] += str2[i]-'0';
      if(str1[i]>'9' && i<len1-1)
        str1[i]-=10, str1[i+1]++;
      while(i+k>=len2 && i+k<len1-1){
        if(str1[i+k]>'9')
          str1[i+k]-=10, str1[i+k+1]++;
        ++k;
      }
    }
    if(str1[len1-1]>'9')
      str1[len1-1]-=10, str1[len1] = '1', str1[len1+1] = '\0';
    reverse(str1, strlen(str1));
    printf("%s",str1);
  }
}

void subtract(char* str)
{
  int j=0,k=1,i,len1,len2;
  char str1[MAXLINE], *str2;
  strcpy(str1, str);
  before_afte(str1, &str2);
  len1 = strlen(str1);
  len2 = strlen(str2);
  reverse(str1, len1);
  reverse(str2, len2);
  if(len1<len2){
    for(i=0; i<len1; i++){
      str2[i]-=str1[i]-'0';
      if(str2[i]<'0')
        str2[i]+=10, str2[i+1]--;
      while(i+k>=len1 && i+k<len2){
        if(str2[i+k]<'0')
          str2[i+k]+=10, str2[i+k+1]--;
        k++;
      }
    }
    reverse(str2,strlen(str2));
    while(str2[j++] == '0')
      ;
    printf("-%s",str2+(j-1));
  }
  else if(len1>len2){
    for(i=0;i<len2;i++){
      str1[i]-=str2[i]-'0';
      if(str1[i]<'0')
        str1[i]+=10, str1[i+1]--;
      while(i+k>=len2 && i+k<len1){
        if(str1[i+k]<'0')
          str1[i+k]+=10, str1[i+k+1]--;
        k++;
      }
    }
    reverse(str1,strlen(str1));
    while(str1[j++]== '0')
      ;
    printf("%s",str1+(j-1));
  }
  else if(len1==len2){
    reverse(str1, len1);
    reverse(str2, len2);
    if(strcmp(str1, str2)>0){
      reverse(str1, len1);
      reverse(str2, len2);
      for(i=0;i<len2;i++){
        str1[i]-=str2[i]-'0';
        if(str1[i]<'0')
          str1[i]+=10, str1[i+1]--;
      }
      reverse(str1, strlen(str1));
      while(str1[j++]== '0')
        ;
      printf("%s",str1+(j-1));
    }
    else if(strcmp(str1, str2)==0){
      printf("0");

    }
    else if(strcmp(str1, str2)<0){
      reverse(str1, len1);
      reverse(str2, len2);
      for(i=0;i<len2;i++){
        str2[i]-=str1[i]-'0';
        if(str2[i]<'0')
          str2[i]+=10, str2[i+1]--;
      }
      reverse(str2,strlen(str2));
      while(str2[j++]=='0')
        ;
      printf("-%s",str2+(j-1));
    }
  }
}
void help()
{
  printf("   > a Digital + Digital         ... Addition operations.\n");

  printf("   > a Digital - Digital         ... Subtraction.");
}
int main(int argc,char* argv[])
{
  char temp[MAXLINE];
  int i,j=1,len;
  argc--;
  while(argc--){
    strcat(temp,argv[j++]);
  }
  len=strlen(temp);
  switch(handelargs(temp,len)){
    case ADD:
    add(temp);
    break;
    case SUB:
    subtract(temp);
    break;
    default:
    help();
  }
}





搜索更多相关主题的帖子: 1024 color 
2012-03-09 14:35
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 2楼 绿茶盖儿
=_=为什么感人呢
2012-03-09 20:56
快速回复:学了1个月了...分享一个刚做的大数加减的程序
数据加载中...
 
   



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

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