大数加法、乘法

本文介绍了一种使用C语言实现两个大整数相加和相乘的方法。通过字符数组来存储大整数,并利用循环实现了逐位相加及进位处理。此外,还提供了大整数相乘的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 
  5 // x1 + x2 = yy
  6 int add_1(char *x1, char *x2, char *yy)
  7 {
  8     int x1_len, x2_len, x_max, yy_len;
  9     int i, j, carry, tt;
 10     char *y1;
 11     
 12     x1_len = strlen(x1);
 13     x2_len = strlen(x2);
 14     
 15     //printf("x1_len:%d, x2_len:%d\r\n", x1_len, x2_len);
 16     
 17     x_max = x1_len > x2_len ? x1_len : x2_len;
 18     // yy_len的最大长度为: x_max+1
 19     // yy_len的最小长度为: x_max
 20     if((y1 = malloc(sizeof(char) * (x_max + 2))) == NULL)
 21     {
 22         return 0;    
 23     }
 24     memset(y1, 0x00, x_max + 2);
 25     
 26     carry  = 0;
 27     yy_len = 0;
 28     for(i=x1_len, j=x2_len; i > 0 && j > 0; i--, j--, yy_len++)
 29     {
 30         tt = (x1[i-1]-'0') + (x2[j-1]-'0') + carry;
 31         y1[yy_len] = (tt % 10) + '0';
 32         carry = tt / 10;
 33     }
 34     for(; i > 0; i--, yy_len++)
 35     {
 36         tt = (x1[i-1]-'0') + carry;
 37         y1[yy_len] = (tt % 10) + '0';
 38         carry = tt / 10;            
 39     }
 40     for(; j > 0; j--, yy_len++)
 41     {
 42         tt = (x2[j-1]-'0') + carry;
 43         y1[yy_len] = (tt % 10) + '0';
 44         carry = tt / 10;            
 45     }
 46     if(carry != 0)
 47     {
 48         y1[yy_len++] = carry + '0';
 49     }
 50     
 51     //printf("yy_len: %d\r\n", yy_len);
 52     
 53     for(i = 0; i < yy_len; i++)
 54     {
 55         yy[i] = y1[yy_len-i-1];
 56     }
 57     yy[yy_len] = '\0';
 58     
 59     free(y1);
 60 
 61     return yy_len;
 62 }
 63 
 64 // x1 + x2 = yy 
 65 int add_2(char *x1, char *x2, char *yy)
 66 {
 67     int x1_len, x2_len, x_max, yy_len;
 68     int i, tmp, carry;
 69     char *y1;
 70     
 71     x1_len = strlen(x1);
 72     x2_len = strlen(x2);
 73     //printf("x1_len:%d, x2_len:%d\r\n", x1_len, x2_len);
 74 
 75     x_max = x1_len > x2_len ? x1_len : x2_len;
 76 
 77     if((y1 = malloc(sizeof(char) * (x_max + 2))) == NULL)
 78     {
 79         return 0;    
 80     } 
 81 
 82     carry = 0;
 83     yy_len = 0;
 84     
 85     while(x1_len > 0 && x2_len > 0)
 86     {
 87         tmp = x1[--x1_len] + x2[--x2_len] - 2 * '0' + carry;
 88         y1[yy_len++] = tmp % 10 + '0';
 89         carry  = tmp / 10;
 90     }
 91     while(x1_len > 0)
 92     {
 93         tmp = x1[--x1_len] - '0' + carry;
 94         y1[yy_len++] = tmp % 10 + '0';
 95         carry  = tmp / 10;
 96     }
 97     while(x2_len > 0)
 98     {
 99         tmp = x2[--x2_len] - '0' + carry;
100         y1[yy_len++] = tmp % 10 + '0';
101         carry  = tmp / 10;     
102     }
103     if(carry != 0)
104     {
105         y1[yy_len++] = carry + '0';
106     }
107 
108     //printf("yy_len: %d\r\n", yy_len);
109     
110     for(i = 0; i < yy_len; i++)
111     {
112         yy[yy_len-i-1] = y1[i];
113     }
114     yy[yy_len] = '\0';
115 
116     free(y1);
117 
118     return yy_len;
119 }
120 
121 // x1 * x2 = yy
122 int mult(char *x1, char *x2, char *yy)
123 {
124     int x1_len, x2_len, yy_len;
125     int i, carry, pos, tt;
126     char *pp;
127     char *y1;
128 
129     x1_len = strlen(x1);
130     x2_len = strlen(x2);
131     
132     //printf("x1_len: %d, x2_len:%d\r\n", x1_len, x2_len);
133     
134     // yy_len的最大长度为: x1_len+x2_len;
135     // yy_len的最小长度为: x1_len+x2_len-1;
136     if((y1 = malloc(sizeof(char) * (x1_len+x2_len+1))) == NULL)
137     {
138         return 0;    
139     }
140     memset(y1, 0x00, x1_len+x2_len+1);
141         
142     for(pos = 0; x2_len > 0; x2_len--, pos++)
143     {
144         carry = 0;
145         pp = &y1[pos];
146         
147         for(i = x1_len; i > 0; i--)
148         {
149             // 当前位的乘积+进位位+原有位
150             tt    = (x2[x2_len-1]-'0') * (x1[i-1]-'0') + carry + (*pp);
151             *pp++ = tt % 10;
152             carry = tt / 10;
153         }
154         
155         if(carry != 0)
156         {
157             *pp++ = carry;
158         }
159     }
160     
161     yy_len = pp - y1;
162     //printf("yy_len: %d\r\n", yy_len);
163 
164     while(y1[yy_len-1] == 0 && yy_len > 0)
165     {
166         yy_len--;
167     }
168     if(yy_len == 0)
169     {
170         yy_len = 1;
171     }
172 
173     for(i = 0; i < yy_len; i++)
174     {
175         yy[yy_len-i-1] = y1[i] + '0';
176     }
177     yy[yy_len] = '\0';
178 
179     free(y1);
180 
181     return yy_len;
182 }
183 
184 int main(void)
185 {
186 #define MAX_LEN     (100)
187     char *x1 = "999";
188     char *x2 = "999";
189     char *yy;
190 
191     yy = malloc(sizeof(char) * MAX_LEN);
192 
193     memset(yy, 0x00, sizeof(char)*MAX_LEN); 
194     add_1(x1, x2, yy);
195     printf("%s + %s = %s\r\n", x1, x2, yy);
196 
197     memset(yy, 0x00, sizeof(char)*MAX_LEN); 
198     add_2(x1, x2, yy);
199     printf("%s + %s = %s\r\n", x1, x2, yy);
200 
201     memset(yy, 0x00, sizeof(char)*MAX_LEN); 
202     mult(x1, x2, yy);
203     printf("%s * %s = %s\r\n", x1, x2, yy);
204 
205     return 0;
206 }

 

转载于:https://www.cnblogs.com/utank/p/5054914.html

1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值