大数乘法的计算原理
2016-03-25 09:41
447 查看
引言:
最近笔者在面试BAT之类的IT公司,没想到网络笔试就需要做大数乘法之类的题型。也因为个人的原因,许久不刷OJ,代码都不会敲了。在此记录一下此次笔试的题。
随便举个例子引入正题:如果让你输入两个整数,整数的长度n(n<21),求它们的和。
接下来讲讲大数乘法的原理,代码后面贴上。
运算原理:
一般的编程语言内定的长整形的数据长度也不会有几十位,如果面试官让你计算长达上百位的数据,你该怎么办?
这个时候必须得充分利用字符串来进行操作。
1)利用字符串存储数字字符,运算时将数字字符转化成对应的整形。
2)按位累乘,将结果记录在数组中。(注意运算从右到左)
3)如果数组中的数据有进位,则需要进一位。
贴代码(如有雷同,纯属巧合Coding with C):
代码一:将进位写入迭代中;
如有问题,请指出改正!
最近笔者在面试BAT之类的IT公司,没想到网络笔试就需要做大数乘法之类的题型。也因为个人的原因,许久不刷OJ,代码都不会敲了。在此记录一下此次笔试的题。
随便举个例子引入正题:如果让你输入两个整数,整数的长度n(n<21),求它们的和。
接下来讲讲大数乘法的原理,代码后面贴上。
运算原理:
一般的编程语言内定的长整形的数据长度也不会有几十位,如果面试官让你计算长达上百位的数据,你该怎么办?
这个时候必须得充分利用字符串来进行操作。
1)利用字符串存储数字字符,运算时将数字字符转化成对应的整形。
2)按位累乘,将结果记录在数组中。(注意运算从右到左)
3)如果数组中的数据有进位,则需要进一位。
贴代码(如有雷同,纯属巧合Coding with C):
代码一:将进位写入迭代中;
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_INPUT_SIZE 21//被乘数和乘数的长度 #define MAX_RESULT_SIZE (MAX_INPUT_SIZE *2 - 1)//乘积的长度 void mult(char result[], char a[], char b[]) { int a_len=strlen(a);//a字符串长度 int b_len=strlen(b);//b字符串长度 char carry=0;//进位标志 char tmp;//临时的计算结果 int a_index, b_index, r_index;//累加器 //因为运算是从右往左,所以循环从数组后面开始 for (b_index = b_len - 1; b_index >=0; b_index--) {//迭代累乘 for (a_index = a_len - 1; a_index >=0; b_index--) { r_index = (b_len-1-b_index) + (a_len-1-a_index);//获取乘积的下标 //string默认存储的是字符串,故需要减去‘0’才能得到真实的数值 tmp = (a[a_index] - '0') * (b[b_index] - '0') + result[r_index] + carry;//计算乘积,未进位 result[r_index] = tmp % 10; carry = tmp / 10;//进位结果作为下一轮循环的初值 } //进位操作(在每轮迭代结束后) while (carry) { //子循环每轮的carry位的数据表示:乘数从低位每轮的进位累加和,所以需要循环(从高位到低位)将进位逐步记录在乘积result当中。 r_index++; tmp = result[r_index] + carry;//临时存储 result[r_index] = tmp % 10; carry = tmp / 10; } } } void print_result(char result[]) { int i = MAX_RESULT_SIZE - 1; while (!result[i]) { i--; } while (i >= 0) { putchar(result[i--] + '0'); } printf("\n"); } int main(int argc,char *argv) { //定义数组空间 char a[MAX_INPUT_SIZE], b[MAX_INPUT_SIZE],result[MAX_RESULT_SIZE]; //清零 memset(a, 0, MAX_INPUT_SIZE); memset(b, 0, MAX_INPUT_SIZE); memset(result, 0, MAX_RESULT_SIZE); //取值并循环运算 while(scanf("%s%s",&a,&b)!=EOF) { //运算 mult(result, a, b); //打印结果 print_result(result); } return 0; }
如有问题,请指出改正!
相关文章推荐
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- C#常见算法面试题小结
- php 面试碰到过的问题 在此做下记录
- asp.net 面试+笔试题目第1/2页
- asp.net 面试 笔试题目[附答案]第1/3页
- java大数乘法的简单实现 浮点数乘法运算
- Python爬虫工程师面试问题总结
- 谈谈最近深圳找工作经历
- 面试:(设计,架构)
- PHP中级面试经历
- 戴维营教育2015年iOS暑期班笔试面试基础考核题
- 一次有意思的面试
- 程序员编程面试取胜的8个技巧
- PHP相关面试中最经常涉及的12个问题
- 产品经理到底该如何自我介绍?
- 产品经理面试过程中如何回答比较宽泛的问题?
- [转]为什么面试官很少向求职者解释原因
- 面试时,你会问面试官哪些问题?