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

最近重新开始了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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值