大整数相乘的C实现
//之前有个测试这个题没做完,现在把它做完,通过这个程序可以对乘法了解更深刻。分析:运用整数乘法,当然进制越高越好,考虑到乘法不要越界,故考虑进制底数N应该满
//足,N^2<2^32次方。所以N最多取四个字符组成的数字。当然我们也可以取LONGLONG的乘法,那么可以取9个字节。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
void sub(char* a, char* sub, int pos, int posn)//sub中不包括a[posn]
{
for(int i=0; i<posn-pos; i++)
sub[i] = a[pos + i];
sub[i] = '\0';
};
int *multi(char *x, char *y, int &sAns){
int sx = strlen(x);
int sy = strlen(y);
int beginX = 0, beginY=0;
if(x[0]=='-') {x[0]='0'; beginX++;}
if(y[0]=='-') {y[0]='0'; beginY++;}
char subx[5],suby[5];//
int i,j,tx,ty;//
sAns = ((sx-1)/4+1 + (sy-1)/4+1);
int * anss = (int *) malloc(sAns*4);
for (i=0; i<sAns; i++)
anss[i] = 0;
for(i=1; i<=(sx-1)/4+1; i++){
sub(x, subx, sx-((i*4)<(sx-beginX)? (i*4):(sx-beginX)), sx-i*4+4);
tx = atoi(subx);
for(j=1; j<=(sy-1)/4+1; j++){
sub(y,suby, sy-((j*4)<(sy-beginY)? (j*4):(sy-beginY)), sy-j*4+4);
ty = atoi(suby);
anss[sAns - ( i + j) + 1] += tx*ty;
anss[sAns - ( i + j ) ] += anss[sAns - (i+j) +1]/10000;
anss[sAns - ( i + j) + 1] %= 10000;//ensure not cross border
}
}
/*for(j=sAns; j>0; j--){
anss[j-1] += anss[j]/10000;
anss[j] =
}*/
return anss;
};
int main(){
char x[100000],y[100000];//Since sAns is a intager less than 2^32/2, mutipliers' places need to be less than 2^29. ie sizeof(x)<0.5 billion bytes(or //sizeof(y)<0.5 billion bytes);
while(scanf("%s%s",&x,&y)){
int flag=0;
if(x[0]=='-') flag++;
if(y[0]=='-') flag++;
int n;
int *a= multi(x,y,n);
if(flag%2 && (n>1||a[0]!=0)) printf("-");
char tt[5],t[5];
t[4]='\0';
int i=0;
while(a[i]==0) i++;
printf("%d", a[i]);
i++;
while(i<n){
if(a[i]<1000) {
itoa(a[i], tt, 10);
int len = strlen(tt);
for(int j=1; j<=len; j++)
t[4-j] = tt[len-j];
while(j<=4) {
t[4-j] = '0';
j++;
}
printf("%s",t);
}
else{
printf("%d", a[i]);
}
i++;
}
printf("\n");
free(a);
}
return 0;
}
大整数相乘的C实现的更多相关文章
- 华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)
题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...
- 大整数相乘问题总结以及Java实现
最近在跟coursera上斯坦福大学的算法专项课,其中开篇提到了两个整数相乘的问题,其中最简单的方法就是模拟我们小学的整数乘法,可想而知这不是比较好的算法,这门课可以说非常棒,带领我们不断探索更优的算 ...
- 大整数乘法python3实现
因为python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,可是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位 ...
- 【老鸟学算法】大整数乘法——算法思想及java实现
算法课有这么一节,专门介绍分治法的,上机实验课就是要代码实现大整数乘法.想当年比较混,没做出来,颇感遗憾,今天就把这债还了吧! 大整数乘法,就是乘法的两个乘数比较大,最后结果超过了整型甚至长整型的最大 ...
- 算法笔记_034:大整数乘法(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 1 问题描述 计算两个大整数相乘的结果. 2 解决方案 2.1 蛮力法 package com.liuzhen.chapter5; import ...
- 剑指offer第12题打印从1到n位数以及大整数加法乘法
字符和数字加减就是字符的ASCII码和数字直接加减. 方法一: 1)在字符串操作中给一个整形数字加(字符0)就是把它转化为字符,当然给一个字符减去(字符0)就可以把它转化为数字了:如果确实是最后 ...
- Java实现大整数乘法
1 问题描述 计算两个大整数相乘的结果. 2 解决方案 2.1 蛮力法 package com.liuzhen.chapter5; import java.math.BigInteger; publi ...
- SOJ 1002/1003/1004 大整数相加/相乘/相除
三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反 ...
- suseoj 1207: 大整数的乘法(java, 大数相乘, C/C++, 大数相乘)
1207: 大整数的乘法 时间限制: 1 Sec 内存限制: 128 MB提交: 7 解决: 2[提交][状态][讨论版][命题人:liyuansong] 题目描述 求两个不超过200位的非负整数 ...
随机推荐
- python学习笔记--Django入门一 网页显示时间
我的笔记是学习http://djangobook.py3k.cn/ 课程时做的,这个上边的文章讲的确实是非常的详细,非常感谢你们提供的知识. 上一篇随笔中已经配置好了Django环境,现在继续跟随ht ...
- Kali Linux 2.0: 安装之后的操作
1. 添加官方软件库 1) 编辑/etc/apt/sources.list leafpad /etc/apt/sources.list 2) 用#注释掉原有的内容,并添加下述内容: # Regular ...
- Bash从路径中获取文件名
#!/bin/bash basename /etc/hosts
- ReactiveCocoa 中signal(operation) then与doNext的区别
贴源码: doNext:实现的主要源代码 return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) {return [ ...
- 为什么要设置Java环境变量(详解)
关于java环境变量配置讲解: 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序.我们需要把 jdk安装目录下 ...
- Jquery Datatables(三)
最近在项目中又使用Datatables的一个有趣功能,官网列子如下图: 点击“+”,展开列表,再次点击收缩. 官网的列子点击展开后的数据也是原来行中的数据,这边有了一个想法是否可以利用Ajax去动态加 ...
- jmeter中webdriver插件,进行自动化压测
1.下载JMeterPlugins-WebDriver-1.1.2 2.将JMeterPlugins-WebDriver-1.1.2\lib\ext中的*.jar拷贝到D:\apache-jmeter ...
- SQL Server 中WITH (NOLOCK)
with(nolock)的功能: 1: 指定允许脏读.不发布共享锁来阻止其他事务修改当前事务读取的数据,其他事务设置的排他锁不会阻碍当前事务读取锁定数据.允许脏读可能产生较多的并发操作,但其代价是读取 ...
- .NET下的加密解密大全(1): 哈希加密
.NET有丰富的加密解密API库供我们使用,本博文总结了.NET下的Hash散列算法,并制作成简单的DEMO,希望能对大家有所帮助. MD5[csharp]using System; using Sy ...
- fmt:formatDate标签的输出格式
http://blog.csdn.net/lidawei201/article/details/7197834