【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; }
运行结果:
相关文章推荐
- 解决类似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的问题
- C++面试笔记--指针和引用
- C++ 类的继承——继承的细节
- 同样是公务员,为什么有人年薪4万有人40万?
- RESTFUL API Server in C++
- 【C语言】03-第一个C程序代码分析
- c语言下的变量类型及计算
- C++ 面向对象 —— 实用程序片段
- 【C语言】02-第一个C程序
- C++模板类的使用
- 基于范围的 for 语句 (C++)
- c/c++强制类型转换
- \r \n 手札
- 【C语言】计算二维数组的边界元素之和
- 二叉树的先序、中序、后序遍历等基本操作c++实现
- 《C++ Concurrency in Action》读书笔记四 c++内存模型和原子类型
- c++ byte与int
- C指针操作——把ip字符串转换成ip range字符串
- 枚举
- 工作中重新封装编写的一系列工具函数(c/c++)