| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6814 人关注过本帖
标题:求两个字符串相加后的模样
只看楼主 加入收藏
云团
Rank: 2
等 级:论坛游民
帖 子:36
专家分:41
注 册:2017-1-9
收藏
得分:0 
#include "stdio.h"
#include "string.h"
void fun1(char *s1,char *s2,char *sum)
 { char ch;
     int i,j,t;
     for(i=0;i<100;i++)
       sum[i]='0';
     i=strlen(s1)-1;
     j=strlen(s2)-1;
     if(i>j) t=i;
     else t=j;
     sum[t+2]='\0';
     for(t++;i>=0&&j>=0;i--,j--)
      { ch=s1[i]+s2[j]-'0'-'0';
          if(ch+sum[t]<=57)
            sum[t--]=sum[t]+ch;
          else
          { sum[t-1]='1';
                 sum[t]=sum[t]+ch-10;
                 t-=1;
          }
      }
      if(i>0)
       for(;i>=0;i--)
         { if(sum[t]+s1[i]-'0'<='9')
              sum[t--]=sum[t]+s1[i]-'0';
           else
             { sum[t-1]='1';
                 sum[t--]=sum[t]+s1[i]-'0'-10;
             }
         }
       else
        for(;j>=0;j--)
         { if(sum[t]+s2[j]-'0'<='9')
              sum[t--]=sum[t]+s2[j]-'0';
           else
             { sum[t-1]='1';
                 sum[t--]=sum[t]+s2[j]-'0'-10;
             }
         }      
 }

void main()
{  
   char s1[100],s2[100],sum[120]="0";
   int i,j;
   printf(" input s1:");
   gets(s1);
   printf(" input s2:");
   gets(s2);
   if(s1[0]!='-'&&s2[0]!='-')
    {  fun1(s1,s2,sum);
       printf(" output sum:");
       if(sum[0]!='0')
       puts(sum);
       else puts(sum+1);
    }
   else if(s1[0]=='-'&&s2[0]=='-')
       {  fun1(s1+1,s2+1,sum+1);
             sum[0]='-';
             printf(" output sum:");
             if(sum[1]!='0')
               puts(sum);
             else
              { sum[1]='-';
                   puts(sum+1);
              }
       }
}


这个程序只能完成同号相加
2017-01-10 20:09
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
怎么回事~~~~

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

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-10 21:04
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
秒懂原来高位不对齐要补0~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-10 21:05
云团
Rank: 2
等 级:论坛游民
帖 子:36
专家分:41
注 册:2017-1-9
收藏
得分:0 
#include "stdio.h"
 #include "string.h"
 void fun1(char *s1,char *s2,char *sum)
  { char ch;
      int i,j,t;
      for(i=0;i<100;i++)
        sum[i]='0';
      i=strlen(s1)-1;
      j=strlen(s2)-1;
      if(i>j) t=i;
      else t=j;
      sum[t+2]='\0';
      for(t++;i>=0&&j>=0;i--,j--)
       { ch=s1[i]+s2[j]-'0'-'0';
           if(ch+sum[t]<=57)
             sum[t--]=sum[t]+ch;
           else
          { sum[t-1]='1';
                  sum[t]=sum[t]+ch-10;
                  t-=1;
           }
       }
       if(i>=0)     // 改为 if(i>=0)  原来的 if(i>0) 没有考虑到高一位的问题
       for(;i>=0;i--)
          { if(sum[t]+s1[i]-'0'<='9')
               sum[t--]=sum[t]+s1[i]-'0';
            else
             { sum[t-1]='1';
                  sum[t--]=sum[t]+s1[i]-'0'-10;
              }
          }
        else
        for(;j>=0;j--)
          { if(sum[t]+s2[j]-'0'<='9')
               sum[t--]=sum[t]+s2[j]-'0';
            else
             { sum[t-1]='1';
                  sum[t--]=sum[t]+s2[j]-'0'-10;
              }
          }      
 }
 
void main()
 {  
    char s1[100],s2[100],sum[120]="0";
    int i,j;
    printf(" input s1:");
    gets(s1);
   printf(" input s2:");
    gets(s2);
    if(s1[0]!='-'&&s2[0]!='-')
     {  fun1(s1,s2,sum);
        printf(" output sum:");
        if(sum[0]!='0')
        puts(sum);
        else puts(sum+1);
     }
    else if(s1[0]=='-'&&s2[0]=='-')
        {  fun1(s1+1,s2+1,sum+1);
              sum[0]='-';
              printf(" output sum:");
              if(sum[1]!='0')
                puts(sum);
              else
              { sum[1]='-';
                    puts(sum+1);
               }
        }
 }
2017-01-10 21:19
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
做了个大位数减法~
这下应该没问题了吧~
程序代码:
/*大位数减法*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void reverse(char s[])
{
    char *p1=s;
    char *p2=s+strlen(s)-1;
    char t=0;

    for (;p1<p2;p1++,p2--)
    {
        t=*p1;
        *p1=*p2;
        *p2=t;
    }
}
void set(char s[])
{
    char *p1=s;
    char *p2=s;

    while (*p2=='0'&&*p2)
        p2++;

    for (;*p2;p1++,p2++)
        *p1=*p2;

    *p1='\0';

}
int judge(char s1[],char s2[])
{
    int len1=strlen(s1);
    int len2=strlen(s2);

    char *p1=s1;
    char *p2=s2;

    if (len1>len2)
        return 1;
    else if (len1<len2)
        return -1;

    while (1)
    {
        if (*p1>*p2)
            return 1;
        else if (*p1<*p2)
            return -1;

        if (*p1=='\0')
            return 0;

        p1++;
        p2++;
    }
}
void fun(char s1[],char s2[],char s3[],int len1,int len2)
{
    char *p1=NULL;
    char *p2=NULL;
    char *pt1=NULL;
    char *pt2=NULL;
    char *p3=s3;
    int k=judge(s1,s2);
    int flag=0;


    if (k==1)
    {
        p1=s1+len1-1;
        p2=s2+len2-1;

        pt1=s1;
        pt2=s2;
    }

    else if (k==-1)
    {
        p1=s2+len2-1;
        p2=s1+len1-1;

        pt1=s2;
        pt2=s1;

    }
    else
    {
        *p3='0';
        return;
    }

    while (1)
    {
        *p3=*p1-*p2+'0'-flag;

        if (*p3<'0')
        {
            *p3+=10;
            flag=1;
        }
        else
            flag=0;

        if (p2==pt2)
        {
            p3++;
            break;
        }

        p1--;
        p2--;
        p3++;
    }

    for(;p1!=pt1;p1--,p3++)
    {
        *p3+=*(p1-1)-flag;
        if (*p3<'0')
        {
            *p3+=10;
            flag=1;
        }
        else
            flag=0;
    }

    reverse(s3);//字符串逆转

    set(s3);

    if (k==-1)
    {
        memmove(s3+1,s3,sizeof(char)*strlen(s3));//这里要注意一下不要写成sizeof(s3)~~
        *s3='-';
    }
}
int main()
{
    char s1[100]="\0";
    char s2[100]="\0";
    char s3[120]="\0";

    printf("input s1:\n");

    gets(s1);

    printf("input s2:\n");

    gets(s2);

    fun(s1,s2,s3,strlen(s1),strlen(s2));

    printf("output sub:\n");

    printf("%s\n",s3);

    return 0;
}



[此贴子已经被作者于2017-1-11 15:23编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-11 00:44
云团
Rank: 2
等 级:论坛游民
帖 子:36
专家分:41
注 册:2017-1-9
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-01-16 11:52
快速回复:求两个字符串相加后的模样
数据加载中...
 
   



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

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