| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2259 人关注过本帖, 1 人收藏
标题:高精度加法(使用指针)
只看楼主 加入收藏
ClearningC
Rank: 2
等 级:论坛游民
帖 子:98
专家分:43
注 册:2016-10-26
结帖率:89.47%
收藏(1)
已结贴  问题点数:20 回复次数:6 
高精度加法(使用指针)
实现函数:
short * plus(short *, short *)
该函数接受两个short型数组作为参数,表示两个高精度非负整数,并返回他们的和。
两个short型数组均一节表示一位,下标为0的是最高位,如a[0] = 1, a[1] = 0,则该数组表示整数10。
返回的数组应当使用同样的格式
Input
只有一组输入
Sample Input
3
1 2 3
2
1 2
Sample Output
123
12
135


一道题目,师兄说比较难(反正我是不会的
2016-12-05 22:50
ClearningC
Rank: 2
等 级:论坛游民
帖 子:98
专家分:43
注 册:2016-10-26
收藏
得分:0 
下面是main函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAXl (100+1)
 
int main() {
    short s1[MAXl], s2[MAXl];
    int l1, l2, i;
    scanf("%d", &l1);
    for (i = 0; i < l1; ++i)
        scanf("%hd", s1+i);
    scanf("%d", &l2);
    for (i = 0; i < l2; ++i)
        scanf("%hd", s2+i);
    s1[l1] = s2[l2] = -1;
    short *plus(short *, short *);
    short *ans = plus(s1, s2);
    for (i = 0; s1[i] >= 0; ++i)
        printf("%hd", s1[i]);
    printf("\n");
    for (i = 0; s2[i] >= 0; ++i)
        printf("%hd", s2[i]);
    printf("\n");
    for (i = 0; ans[i] >= 0; ++i)
        printf("%hd", ans[i]);
    printf("\n");
    free(ans);
    return 0;
}
求 short * plus(short *s1, short *s2)这个函数
2016-12-05 22:51
luoj75
Rank: 2
等 级:论坛游民
帖 子:17
专家分:55
注 册:2016-11-28
收藏
得分:5 
short *plus(short *s1, short *s2){
  int i,j,num1,num2,flag,k;
   short *ans,temp[103];
   ans=(short *)malloc(103*sizeof(short));
   k=flag=i=j=0;
   while(s1[i+1]!=-1) i++;
   while(s2[j+1]!=-1) j++;
   for(;i>=0||j>=0||flag==1;i--,j--)
   {
     if(i<0) num1=0;
     else num1=s1[i];
     if(j<0) num2=0;
     else num2=s2[j];
     temp[k]=flag+num1+num2;
     if(temp[k]>9) {
       flag=1;
       temp[k]-=10;
     }
     else flag=0;
     k++;
   }
   i=0;
   while((--k)>=0) ans[i++]=temp[k];
   ans[i]=-1;
   return ans;
 }
2016-12-05 23:18
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
回复 3楼 luoj75
我整合了你的代码,那个运行结果有点问题,再看看~
图片附件: 游客没有浏览图片的权限,请 登录注册


整合后代码如下:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

 
#define MAXl (100+1)

 
int main() 
{
    short *plus(short *, short *);
    short *ans;
    short s1[MAXl], s2[MAXl];
    int l1, l2, i;

    scanf("%d", &l1);

    for (i = 0; i < l1; ++i)
        scanf("%hd", s1+i);

    scanf("%d", &l2);

    for (i = 0; i < l2; ++i)
        scanf("%hd", s2+i);

    s1[l1] = s2[l2] = -1;
     ans = plus(s1, s2);

    for (i = 0; s1[i] >= 0; ++i)
        printf("%hd", s1[i]);

    printf("\n");

    for (i = 0; s2[i] >= 0; ++i)
        printf("%hd", s2[i]);

    printf("\n");

    for (i = 0; ans[i] >= 0; ++i)
        printf("%hd", ans[i]);

    printf("\n");

    free(ans);

    return 0;
}
short *plus(short *s1, short *s2)
{
   int i,j,num1,num2,flag,k;
   short *ans,temp[103];

   ans=(short *)malloc(103*sizeof(short));

   k=flag=i=j=0;

   while(s1[i+1]!=-1)
       i++;

   while(s2[j+1]!=-1)
       j++;

   for(;i>=0||j>=0||flag==1;i--,j--)
   {

     if(i<0) 
         num1=0;
     else 
         num1=s1[i];
     if(j<0)
         num2=0;
     else 
         num2=s2[j];

     temp[k]=flag+num1+num2;

     if(temp[k]>9)
     {
       flag=1;
       temp[k]-=10;
     }
     else 
         flag=0;
     k++;
   }

   i=0;

   while((--k)>=0) 
       ans[i++]=temp[k];

   ans[i]=-1;

   return ans;

 }

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-05 23:42
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 luoj75
没事了,题目说一节表示一位,这样好算~可以了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-06 00:33
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
参考3楼的写法,自己改进了一下算法~
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

 
#define MAXl (100+1)

int main() 
{
    short *plus(short *, short *);
    short *ans;
    short s1[MAXl], s2[MAXl];
    int l1, l2, i;

    scanf("%d", &l1);

    for (i = 0; i < l1; ++i)
        scanf("%hd", s1+i);

    scanf("%d", &l2);

    for (i = 0; i < l2; ++i)
        scanf("%hd", s2+i);

    s1[l1] = s2[l2] = -1;
     ans = plus(s1, s2);

    for (i = 0; s1[i] >= 0; ++i)
        printf("%hd", s1[i]);

    printf("\n");

    for (i = 0; s2[i] >= 0; ++i)
        printf("%hd", s2[i]);

    printf("\n");

    for (i = 0; ans[i] >= 0; ++i)
        printf("%hd", ans[i]);

    printf("\n");

    free(ans);

    return 0;
}
short *plus(short *s1, short *s2)
{
   int i,j,k;
   short *ans;

   ans=(short *)malloc(103*sizeof(short));
   memset(ans,0,103*sizeof(short));

   i=j=0;

   while(s1[i+1]!=-1)
       i++;

   while(s2[j+1]!=-1)
       j++;

   k=i>j?i+1:j+1;
   ans[k+1]=-1;

   for (;i>=0||j>=0;i--,j--,k--)
   {
       if (i>=0)
           ans[k]+=s1[i];

       if (j>=0)
           ans[k]+=s2[j];

       if (ans[k]>9)
       {
           ans[k]-=10;
           ans[k-1]++;
       }
   }

   if (ans[0]==0)
       for (i=0;ans[i]!=-1;i++)
           ans[i]=ans[i+1];

    return ans;

 }//题目最后释放ans提示ans的数据储存在堆里面,当ans[0]!=0时,不能直接返回ans+1,当然这样可以回收空间


[此贴子已经被作者于2016-12-6 02:02编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-06 02:00
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:5 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXl (100+1)

int _isNum(const char *num)
{
    for (; *num; num++)
    {
        if ((*num > '9') || (*num < '0'))
            return 0;
    }
    return 1;
}


char *_add(char *result, int resultLen, char *s, int sLen)
{
    char *p1=result+resultLen-1;
    char *p2=s+sLen-1;
    for (; p1>=result && p2>=s; p1--, p2--)
        *p1 += *p2-'0';
    return result;   
}

char *_Carry(char *result, int resultLen)
{
    char *p=result+resultLen-1;
    for (; p>=result; p--)
    {
        if (*p >= 10)
        {
            *(p-1) += 1;
            *p = *p-10;
        }
        *p = *p+'0';
    }
    if (*result == '0')
    {
        *result = 0;
        strcat(result, result+1);
    }
    return result;
}

char *plus(char *s1, char *s2)
{
    int s1Len = strlen(s1);
    int s2Len = strlen(s2);
    int resultLen  = 1 + (s1Len>s2Len?s1Len:s2Len);
    char *result = (char*)calloc(resultLen+1, sizeof(char));
    _add(result, resultLen, s1, s1Len);
    _add(result, resultLen, s2, s2Len);
    _Carry(result, resultLen);
    return result;
}

int main()
{
    char s1[MAXl], s2[MAXl];
    printf("被加数:"); gets(s1);
    printf("加数:"); gets(s2);
    if (!_isNum(s1)) return 0;
    if (!_isNum(s2)) return 0;
    char *ans = plus(s1, s2);
    printf("和:"); puts(ans);
    free(ans);
    return 0;
}
2016-12-06 06:42
快速回复:高精度加法(使用指针)
数据加载中...
 
   



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

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