鱼C论坛

 找回密码
 立即注册
查看: 744|回复: 4

[已解决]C语言!

[复制链接]
发表于 2021-1-7 22:59:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
以下程序完成两个长正整数的加法运算并输出计算结果。函数add模拟手工加法运算的过程,将a和b指向的数组中存储的两个以字符串形式表示的n位正整数相加,并将运算结果以字符串形式保存到c指向的数组中。main函数中p1和p2数组分别存放被加数字符串和加数字符串,p3数组存放运算结果字符串。若p1中的字符串为"1000000001"、p2中的字符串为"9000000009",调用add函数后p3得到的是以字符串表示的这两个整数相加的结果"10000000010"。试完善程序以达到要求的功能。
#include "stdio.h"
#include "string.h"
void add(char a[],char b[],char c[],    int n       )  
{  int i,k;
   c[n]='\0'; k=0;
   for(i=n-1;i>=0;i--)
   {  c[i]=(a[i]-'0')+(b[i]-'0')+k;      // 为啥有减去‘0’,这表示啥呀?
      k=       c[i]/10       ;         
      c[i]=c[i]%10+'0';
   }
   if(k)
   {  for(i=n+1;i>0;i--)
           c[i]=     c[i-1]        ;
      c[i]=k+'0';
   }
main()
{  char p1[80]="1000000001",p2[80]="9000000009",p3[80];
   int i,x=strlen(p1),y=strlen(p2);
   if(x<y)
   {  for(i=x;i>=0;i--)
      {  p1[i+y-x]=p1[i];  p1[i]='0';  }      // 为啥还要p1[i]='0'
            x=y    ;         
   }  
   if(x>y)
     for(i=y;i>=0;i--)
     {  p2[i+x-y]=p2[i];  p2[i]='0'; }
   add(p1,p2,p3,x);     
   puts(p3);
}
最佳答案
2021-1-8 01:01:01
#include<stdio.h>
#include<string.h>
void add(char a[], char b[], char c[], int n)
{
        int i, k;
        c[n] = '\0'; k = 0;
        for (i = n - 1;i >= 0;i--)
        {
                c[i] = (a[i] - '0') + (b[i] - '0') + k; // 将字符型数字转换为整型数字进行运算
                k = c[i] / 10;                          // 取进位(大于10就有进位)
                c[i] = c[i] % 10 + '0';                 // 将整型数字转换为字符型数字存入c[i]
        }
        if (k)
        {
                for (i = n + 1;i > 0;i--)
                        c[i] = c[i - 1];
                c[i] = k + '0';
        }
}    // 少了一个花括号

int main()
{
        char p1[80] = "1000000001", p2[80] = "900000009", p3[80];
        int i, x = strlen(p1), y = strlen(p2);
        if (x < y)
        {
                for (i = x;i >= 0;i--)
                {
                        p1[i + y - x] = p1[i];
                        p1[i] = '0';      // p1[i]的数住后移了,该位上的数置'0',确保最前面没有数的位是0
                }
                x = y;
        }
        if (x > y)
                for (i = y;i >= 0;i--)
                {
                        p2[i + x - y] = p2[i];
                        p2[i] = '0';
                }
        add(p1, p2, p3, x);
        puts(p3);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-8 01:01:01 | 显示全部楼层    本楼为最佳答案   
#include<stdio.h>
#include<string.h>
void add(char a[], char b[], char c[], int n)
{
        int i, k;
        c[n] = '\0'; k = 0;
        for (i = n - 1;i >= 0;i--)
        {
                c[i] = (a[i] - '0') + (b[i] - '0') + k; // 将字符型数字转换为整型数字进行运算
                k = c[i] / 10;                          // 取进位(大于10就有进位)
                c[i] = c[i] % 10 + '0';                 // 将整型数字转换为字符型数字存入c[i]
        }
        if (k)
        {
                for (i = n + 1;i > 0;i--)
                        c[i] = c[i - 1];
                c[i] = k + '0';
        }
}    // 少了一个花括号

int main()
{
        char p1[80] = "1000000001", p2[80] = "900000009", p3[80];
        int i, x = strlen(p1), y = strlen(p2);
        if (x < y)
        {
                for (i = x;i >= 0;i--)
                {
                        p1[i + y - x] = p1[i];
                        p1[i] = '0';      // p1[i]的数住后移了,该位上的数置'0',确保最前面没有数的位是0
                }
                x = y;
        }
        if (x > y)
                for (i = y;i >= 0;i--)
                {
                        p2[i + x - y] = p2[i];
                        p2[i] = '0';
                }
        add(p1, p2, p3, x);
        puts(p3);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-8 01:09:34 | 显示全部楼层
本帖最后由 jackz007 于 2021-1-8 09:08 编辑
#include <stdio.h>
#include <string.h>

char * reverse(char s[])
{
        char c                      ;
        int i , n                   ;
        for(n = 0 ; s[n] ; n ++)    ;
        for(i = 0 ; i < n / 2 ; i ++) {
                c = s[i]            ;
                s[i] = s[n - 1 - i] ;
                s[n - 1 - i] = c    ;
        }
        return s                    ;
}

char * add(char c[] , char a[] , char b[])
{
        int d , e , i , j                         ;
        reverse(a)                                ;
        reverse(b)                                ;
        c[0] = '\0'                               ;
        for(d = e = i = j = 0 ; a[i] || b[j] ; d ++) {
                c[d] = 0                          ;
                if(e) c[d] ++                     ;
                e = 0                             ;
                if(a[i]) {
                        c[d] = c[d] + a[d] - '0'  ;
                        i ++                      ;
                }
                if(b[j]) {
                        c[d] = c[d] + b[d] - '0'  ;
                        j ++                      ;
                }
                if(c[d] > 9) {
                        c[d] -= 10                ;
                        e = 1                     ;
                }
                c[d] += '0'                       ;
        }
        if(e) c[d ++] = '1'                       ;
        c[d] = '\0'                               ;
        reverse(a)                                ;
        reverse(b)                                ;
        reverse(c)                                ;
        return c                                  ;
}

int main(void)
{
        char p1[80]="1000000001" , p2[80] = "9000000009" , p3[80] ;
        printf("%s\n" , add(p3 , p1 , p2))                        ;
        strcpy(p1 , "999999999999999999999999999999999999999999") ;
        strcpy(p2 , "9")                                          ;
        printf("%s\n" , add(p3 , p1 , p2))                        ;
}
        编译、运行实况
D:\00.Excise\C>g++ -o add add.c

D:\00.Excise\C>add
10000000010
1000000000000000000000000000000000000000008
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-8 16:36:17 | 显示全部楼层
jackz007 发表于 2021-1-8 01:09
编译、运行实况

本渣表示没看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-8 16:49:22 | 显示全部楼层

我大概能给你解释下‘0’这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 04:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表