[CS@Nets]C语言进阶的一道编程题

来源:互联网 发布:smtp的默认端口是 编辑:程序博客网 时间:2024/05/19 08:01

最近重新开始了MOOC学习[1],这一次的目的更为明确而纯粹,Computer Science。为成为一名码农而奋斗。

目前已经完成了一门课的考试,C语言设计进阶,ZJU的翁恺老师讲授。关于这门课,我希望能够用三篇博客去总结,一篇是C语言私人备查,一篇是ACLGUI的代码解读(可能需要不止一篇),一篇即本篇,一道没有做完的编程习题——大数计算问题。

具体问题描述找不到了,简言之就是超出一般int表示的数之间的加法、减法和乘法运算。

解题思路:模仿人工计算的方法。
12345*234 = 12345*4+12345*3*10+12345*2*10*10
IDE: Code::Block

自己写了四个子函数

void inverse_sequence(const char *s, char *news);void seq_plus(const char *s, char *rs);void seq_times_bit(const char *s, const int t, char *rstmp);void seq_times_10x(char *s, int bits);

输入数据使用数组保存,加法和按位乘法都是对数组进行的操作,需要注意加乘法中的进位和数组初始化、界限问题。另,为方便计算机处理,首先要对输入的数据进行倒序处理(在考试的时候按照正序处理的,处理进位比较麻烦,当然就算当时倒序做的在一个小时内写出来也不太可能,目前的编程功力还是偏弱)。
10x这个乘法是模拟人工计算时的移位操作。
核心的处理段为

    for(i = 0;i<lens;i++)    {        memset(sr,'\0',sizeof(sr));        ttmp = inv_s_short[i]-'0';        seq_times_bit(inv_s_long,ttmp,sr);        seq_times_10x(sr,i);        seq_plus(sr,srfinal);    }

要注意注意数组初始化的问题。

整体处理算法非常普通,复杂度O(n2),很弱。在网上看到大数计算有用FFT处理的,复杂度大概是O(n),并且程序更为简洁,可见,算法才是王道

0 0
原创粉丝点击