您的位置:首页 > 编程语言 > C语言/C++

【C/C++学习笔记】C 实现大整数的加法操作 —— 纪念入职公司时的上机题

2016-05-26 18:02 696 查看
入职公司的时候,上机题就是下面的“大整数加法的实现”,这道题对C基础知识还是有点帮助的。

实现代码:

/* big_number_add         */
/* 2015.01.20             */
/* 大整数加法运算           */
/* author: TianMaotang    */
/* 1、字符串操作;2、指针操作 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define MAX_LEN 1024

/* 全是数字返回0, 否则返回-1 */
int all_is_num(const char *num){
int i = 0;
int num_len = strlen(num);

if(0 == num_len){
return -1;
}

for(i = 0; i < num_len; i++)
{
if(num[i] > '9' || num[i] < '0'){
printf("!! is not num: %c \r\n", num[i]);
return -1;
}
}

return 0;
}

/* 加操作 */
void ll_num_add(char *added, const char* add_pre, const char* add_end){
int i = 0;
char mov = '0', sum = '0';

int len = strlen(add_pre);

char swap_arr[len+1];

for(i=len-1; i>=0; i--){
char m = add_pre[i] - '0';
char n = add_end[i] - '0';

sum = m + n;
if(sum > 9){
if(mov == '0'){
sum = sum - 10;
mov  = '1';
}
else if(mov == '1'){
sum = sum - 10 + 1;
}
}else{
if(mov == '1'){
sum += 1;
if(sum > 9){
sum = sum - 10;
mov == '1';
}
else{
mov = '0';
}
}
}

swap_arr[i+1] = sum + '0';
}
swap_arr[len+1] = '\0';

if(mov == '1'){
swap_arr[0] = '1';
strcpy(added, swap_arr);
}else{
/* 删掉第一位 */
strcpy(added, swap_arr+1);
}
printf("%s \r\n", added);
}

/* 用于给短字符串前面补零 */
void len_opera(char *added, const char* add_pre, const char* add_end, int pre_len, int end_len){
int i;
int max_len = pre_len > end_len ? pre_len : end_len;
int min_len = pre_len < end_len ? pre_len : end_len;

char max_arr[max_len+1];
char min_arr[max_len+1];

for(i = 0; i < max_len - min_len; i++){
min_arr[i] = '0';
}

for(i = 0; i < min_len; i++){
if(pre_len < end_len)
min_arr[(max_len-min_len)+i] = add_pre[i];
else
min_arr[max_len-min_len+i] = add_end[i];
}

for(i = 0; i < max_len; i++)
{
if(pre_len < end_len)
max_arr[i] = add_end[i];
else
max_arr[i] = add_pre[i];
}

max_arr[max_len] = '\0';
min_arr[max_len] = '\0';
ll_num_add(added, (const char *)max_arr, (const char *)min_arr);
}

/* 上层逻辑控制 */
void num_add(char *added, const char* add_pre, const char* add_end){
if(-1 == all_is_num(add_pre) || -1 == all_is_num(add_end)){
strcpy(added, "");
}else{
printf(">> %s + %s = ", add_pre, add_end);
int pre_len = strlen(add_pre);
int end_len = strlen(add_end);
if(pre_len != end_len)
len_opera(added, add_pre, add_end, pre_len, end_len);
else
ll_num_add(added, add_pre, add_end);
}
}

int main(int argc, char **argv){
char added[MAX_LEN] = {0};

//大整数加法计算器
#if 1
if(argc != 3)
{
printf("Usage:  %s   num_add   num_added\r\n", argv[0]);
return -1;
}
num_add(added, (const char *)argv[1], (const char *)argv[2]);
#endif

/* 所有assert()测试 */
#if 0
num_add(added, "", "");
assert(0 == strcmp("", added));
num_add(added, "", "3");
assert(0 == strcmp("", added));
num_add(added, "6", "");
assert(0 == strcmp("", added));
num_add(added, "6", "3");
assert(0 == strcmp("9", added));
num_add(added, "7a", "44");
assert(0 == strcmp("", added));
num_add(added, "9999", "999");
assert(0 == strcmp("10998", added));
num_add(added, "101", "99");
assert(0 == strcmp("200", added));

num_add(added, "1234567890123456789012345678901111111111", "1234567890123456789012345678901111111111");
assert(0 == strcmp("2469135780246913578024691357802222222222", added));
#endif

return 0;
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: