鱼C论坛

 找回密码
 立即注册
查看: 849|回复: 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
  1. #include<stdio.h>
  2. #include<string.h>
  3. void add(char a[], char b[], char c[], int n)
  4. {
  5.         int i, k;
  6.         c[n] = '\0'; k = 0;
  7.         for (i = n - 1;i >= 0;i--)
  8.         {
  9.                 c[i] = (a[i] - '0') + (b[i] - '0') + k; // 将字符型数字转换为整型数字进行运算
  10.                 k = c[i] / 10;                          // 取进位(大于10就有进位)
  11.                 c[i] = c[i] % 10 + '0';                 // 将整型数字转换为字符型数字存入c[i]
  12.         }
  13.         if (k)
  14.         {
  15.                 for (i = n + 1;i > 0;i--)
  16.                         c[i] = c[i - 1];
  17.                 c[i] = k + '0';
  18.         }
  19. }    // 少了一个花括号

  20. int main()
  21. {
  22.         char p1[80] = "1000000001", p2[80] = "900000009", p3[80];
  23.         int i, x = strlen(p1), y = strlen(p2);
  24.         if (x < y)
  25.         {
  26.                 for (i = x;i >= 0;i--)
  27.                 {
  28.                         p1[i + y - x] = p1[i];
  29.                         p1[i] = '0';      // p1[i]的数住后移了,该位上的数置'0',确保最前面没有数的位是0
  30.                 }
  31.                 x = y;
  32.         }
  33.         if (x > y)
  34.                 for (i = y;i >= 0;i--)
  35.                 {
  36.                         p2[i + x - y] = p2[i];
  37.                         p2[i] = '0';
  38.                 }
  39.         add(p1, p2, p3, x);
  40.         puts(p3);
  41. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  20. int main()
  21. {
  22.         char p1[80] = "1000000001", p2[80] = "900000009", p3[80];
  23.         int i, x = strlen(p1), y = strlen(p2);
  24.         if (x < y)
  25.         {
  26.                 for (i = x;i >= 0;i--)
  27.                 {
  28.                         p1[i + y - x] = p1[i];
  29.                         p1[i] = '0';      // p1[i]的数住后移了,该位上的数置'0',确保最前面没有数的位是0
  30.                 }
  31.                 x = y;
  32.         }
  33.         if (x > y)
  34.                 for (i = y;i >= 0;i--)
  35.                 {
  36.                         p2[i + x - y] = p2[i];
  37.                         p2[i] = '0';
  38.                 }
  39.         add(p1, p2, p3, x);
  40.         puts(p3);
  41. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. char * reverse(char s[])
  4. {
  5.         char c                      ;
  6.         int i , n                   ;
  7.         for(n = 0 ; s[n] ; n ++)    ;
  8.         for(i = 0 ; i < n / 2 ; i ++) {
  9.                 c = s[i]            ;
  10.                 s[i] = s[n - 1 - i] ;
  11.                 s[n - 1 - i] = c    ;
  12.         }
  13.         return s                    ;
  14. }

  15. char * add(char c[] , char a[] , char b[])
  16. {
  17.         int d , e , i , j                         ;
  18.         reverse(a)                                ;
  19.         reverse(b)                                ;
  20.         c[0] = '\0'                               ;
  21.         for(d = e = i = j = 0 ; a[i] || b[j] ; d ++) {
  22.                 c[d] = 0                          ;
  23.                 if(e) c[d] ++                     ;
  24.                 e = 0                             ;
  25.                 if(a[i]) {
  26.                         c[d] = c[d] + a[d] - '0'  ;
  27.                         i ++                      ;
  28.                 }
  29.                 if(b[j]) {
  30.                         c[d] = c[d] + b[d] - '0'  ;
  31.                         j ++                      ;
  32.                 }
  33.                 if(c[d] > 9) {
  34.                         c[d] -= 10                ;
  35.                         e = 1                     ;
  36.                 }
  37.                 c[d] += '0'                       ;
  38.         }
  39.         if(e) c[d ++] = '1'                       ;
  40.         c[d] = '\0'                               ;
  41.         reverse(a)                                ;
  42.         reverse(b)                                ;
  43.         reverse(c)                                ;
  44.         return c                                  ;
  45. }

  46. int main(void)
  47. {
  48.         char p1[80]="1000000001" , p2[80] = "9000000009" , p3[80] ;
  49.         printf("%s\n" , add(p3 , p1 , p2))                        ;
  50.         strcpy(p1 , "999999999999999999999999999999999999999999") ;
  51.         strcpy(p2 , "9")                                          ;
  52.         printf("%s\n" , add(p3 , p1 , p2))                        ;
  53. }
复制代码

        编译、运行实况
  1. D:\00.Excise\C>g++ -o add add.c

  2. D:\00.Excise\C>add
  3. 10000000010
  4. 1000000000000000000000000000000000000000008
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本渣表示没看懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我大概能给你解释下‘0’这个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-3 05:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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