大整数运算---模拟笔算

HyperLynx(十九)DDR(二)DDR的地址仿真 (5)设置水平标尺为2ns/div,垂直标尺为500mV/div,如果有必要,可以通过多次仿真,得到一个更加理想的结果。此外,还可以看到信号在高低电平切换时,反射波形基本趋于平缓,许多大的反射切换边缘已减小,这给了我们更大的定时裕量。如果这些DIMM是缓冲过的,则4个DIMM通道是可行的,但因为这是一个无缓冲DIMM,(20)在编辑传输线对话框中,选择“Values”选项卡,改变传输线长度为3in,具体设置如图所示,单击“确定”按钮。(17)为了增加电压摆幅,选择一个比原来的47Ω小的电阻。 阅读详情
/*
*m=a[k]×10k-1+a[k-1]×10k-2+….+a[2]×10+a[1]
*其中a[0]保存该长整数的位数。
*
*模拟笔算
*/
#include<iostream>
#include<cstring>
using namespace std;
#define SIZE 255

void getl(char* n);//获取长整数
void prt(char* n);//打印长整数
int cmp(char* n1, char* n2);//比较长整数大小
void swap(char * n);//长整数位交换
void cpy(char* n1, char* n2);//复制长整数
/**********************************************/
//乘法
void mul(char* n1, char* n2);
void muld(char* n, int t, char num);//位乘
/**********************************************/
//除法
void div(char* n1, char* n2, char* q);
/**********************************************/
//加法
void plu(char* n1, char* n2);
int plua(char* n, int off, char num);//位加
/**********************************************/
//减法
int sub(char* n1, char* n2);//返回0正1负
int suba(char* n1, int off, char num);//位减
/**********************************************/

int main(int argc, char** argv){
	cout<<"长整数乘除法运算。"<<endl<<endl;
	while(1){
		cout<<"请选择运算: 1.乘法; 2.除法。"<<endl;
		int t;
		//t=2;
		cin>>t;
		if(t == 1){
			cout<<"请依次输入 被乘数、乘数。"<<endl;
		}else if(t == 2){
			cout<<"请依次输入 被除数、除数。"<<endl;
		}else{
			cout<<"输入错误,请重试。";
			continue;
		}
		fflush(stdin);
		char n1[SIZE]={0},n2[SIZE]={0};
		getl(n1);
		getl(n2);
		if(t == 1){
			mul(n1, n2);
			cout<<"结果:";
			prt(n1);
		}
		else{
            char q[SIZE] = {0};
			if(n2[0]==1 && n2[1]==0){
				cout<<"输入错误:除数不能为0"<<endl;
				continue;
			}
            div(n1, n2, q);
            cout<<"商:";
			prt(n1);
			cout<<"余数:";
            prt(q);
		}
	}
	return 0;
}
/**********************************************/
void getl(char* n){
	//从console获取一个长整数
	char tmp;
	while(tmp = getchar()){
		if(tmp <= '9'&&tmp >= '0'){
			break;
		}
	}
	int i=1;
	while(tmp <= '9'&&tmp >= '0'){
		n[i] = tmp;
		n[i] -= '0';
		tmp = getchar();
		i++;
	}
	n[0] = i-1;
	swap(n);
}
void prt(char* n){
    //打印一个大整数
	if(n[0] == 0){
		cout<<"0";
	}
    for(int i=n[0];i >= 1; i--){
        cout<<char(n[i] + '0');
    }
    cout<<endl;
}
int cmp(char* n1, char* n2){
    //比较两个大整数的大小 n1>n2返回1
    if(n1[0] > n2[0]){
        return 1;
    }else if(n1[0] < n2[0]){
        return -1;
    }else{
        for(int i=n1[0]; i>=1; i--){
            if(n1[i] == n2[i]){
                continue;
            }else{
                if(n1[i] > n2[i]){
                    return 1;
                }else{
                    return -1;
                }
            }
        }
    }
    return 0;
}
void swap(char* n){
	//按脚码逆置一个大整数
	char tmp;
	for(int i=1; i<=n[0]/2; i++){
		tmp = n[i];
		n[i] = n[n[0] - i + 1];
		n[n[0] - i + 1] = tmp;
	}
}
void cpy(char* n1, char* n2){
	//将n1复制为n2
	for(int i=0; i<=n2[0]; i++){
		n1[i] = n2[i];
	}
}
/**********************************************/
void mul(char* n1, char* n2){
	//乘法,结果保存在n1
	char result[SIZE] = {0};
	char tmp[SIZE] = {0};
	for(int i=1; i<=n2[0]; i++){
		cpy(tmp, n1);
		muld(tmp, i - 1, n2[i]);
		plu(result, tmp);
	}
	cpy(n1, result);
}
void muld(char* n, int t, char num){
	//个位数乘,将n乘以 后跟t个零的个位数num,完成进位
	char k = 0;//进位数
	int i;
	for(i = 1; i<=n[0]; i++){
		n[i] *= num;
		n[i] += k;
		if(n[i] > 9){
			k = n[i]/10;
			n[i] %= 10;
		}else{
			k = 0;
		}
	}
	if(k){
		n[0]++;
		n[i] = k;
	}
	//左移
	for(int i=n[0]; i>=1; i--){
		n[i+t] = n[i];
	}
	for(int i=1; i<=t; i++){
		n[i] = 0;
	}
	n[0] += t;
}
/*
*已废弃
int mula(char* n, int off, char num){
	//位乘,将n偏移为off的地方乘上num,返回进位
	n[off] *= num;
	cout<<"off "<<off<<endl;
	logi("n[off] ",n[off]%10);
	logi("num ",num);
	if(n[off] > 9){
		n[off] %= 10;
		return n[off]/10;
	}else{
		return 0;
	}
}
void mulplu(char* n, int off, char num){
	//乘法中用到的加法,将n偏移为off的位加上num,完成进位,结果保存在n
	int i;
	char k = n[off];
	for(i=off; k||i==off; i++){
		k = plua(n, i, k);
	}
	//i:最前面的不是进位的偏移
	if(i-2 > n[0]){
		n[0] = i-2;
	}
}
*/
/**********************************************/
/*
从n1最高位开始
余数=0
while(可以向右截取){
    余数 加上向右取的
    while(取得的数小于n2){
        向右取
    }
    while(余数 >= n2){
        商++
        余数 -= n2
    }
	商放在结果的 截取位的最右位
	余数乘以10
}
*/
void div(char* n1, char* n2, char* q){
	//除法,商保存在n1,余数保存在q
	char remd[SIZE] = {0};//余数
    char ans[SIZE] = {0};//结果
    char d[SIZE] = {0};//截取的一位数
	d[0] = 1;
	char ten[SIZE] = {0};//长整数10
	ten[0] = 2;
	ten[1] = 0;
	ten[2] = 1;
	//保存未乘10的个位余数
	char tn[SIZE] = {0};
	bool over = false;
    int w = n1[0];//截取位
	while(w != 0){
		d[1] = n1[w];
		plu(remd, d);
		while(cmp(remd, n2) == -1){
			//乘10之前保存个位余数
			if(w == 1){
				cpy(tn, remd);
			}
			mul(remd, ten);
			w--;
			//向右取之前确定可以取
			if(w == 0){
				over = true;
				break;
			}
			d[1] = n1[w];
			plu(remd, d);
		}
		if(over){
			break;
		}
		char qu = 0;//商
		while(cmp(remd, n2) != -1){
			qu++;
			sub(remd, n2);
		}
		//加在结果的当前截取到位
		plua(ans, w, qu);
		//乘10之前保存个位余数
		if(w == 1){
			cpy(tn, remd);
		}
		mul(remd, ten);
		w--;
	}
	cpy(remd, tn);
	//计算ans的位数
    for(int i=n1[0]; i>=1; i--){
        if(ans[i] != 0){
            ans[0] = i;
            break;
        }
    }
    cpy(n1, ans);
    cpy(q, remd);
}
/**********************************************/
void plu(char* n1, char* n2){
	//加法,结果保存在n1
	int i;
	int k = 0;
	int maxlen = n1[0]>n2[0]?n1[0]:n2[0];
	for(i=1; i<=maxlen; i++){
		k = plua(n1, i, n2[i] + k);
	}
	n1[0] = maxlen;
	if(k){
		n1[0]++;
		n1[i] = k;
	}
}
int plua(char* n, int off, char num){
	//位加法,将n偏移为off的地方加上num,返回进位
	n[off] += num;
	if(n[off] > 9){
		int t = n[off]/10;
		n[off] %= 10;
		return t;
	}else{
		return 0;
	}
}
/**********************************************/
int sub(char* n1, char* n2){
    //减法,n1:被减数 n2:减数 n1>=n2 结果放在n1 返回1负数0正数
    int foo;
    char t[SIZE] = {0};
    if((foo = cmp(n1, n2)) == -1){
        cpy(t, n2);
        cpy(n2, n1);
        cpy(n1, t);
    }
    char w = 0;//借位数
    int i=1;
    for(;i<=n2[0]; i++){
        w = suba(n1, i, n2[i] + w);
    }
    while(w){
        w = suba(n1, i, n2[i] + w);
        i++;
    }
    //清除无效0
    for(int k=n1[0]; k>=1; k--){
        if(n1[k] == 0){
            n1[0]--;
        }else{
            break;
        }
    }
    if(foo == -1){
        //复原n2
        cpy(n2, t);
        return 1;
    }else{
        return 0;
    }
}
int suba(char* n, int off, char num){
	//位减法,将n偏移为off的地方减去num,返回借位
    n[off] -= num;
    if(n[off] < 0){
        n[off] += 10;
        return 1;
    }else{
        return 0;
    }
}
/**********************************************/

Altium Designer(AD24/25)PCB编辑的几种方法介绍 本文介绍了Altium Designer(AD24/25)软件中PCB编辑的四种操作方法:1)通过菜单栏"Place→Component"激活;2)点击工具栏元器件图标;3)右键快捷菜单选择;4)快捷键P+C组合操作。建议初学者先通过菜单栏和快捷菜单熟悉操作,熟练后转为工具栏和快捷键以提高效率。文章配有操作示意图,帮助用户快速掌握PCB元器件放置技巧。 阅读详情

相关推荐

添加odbc数据源时的一些问题和解决办法

pl/sql

Mr_Syh的博客 9641

C语言 大整数乘法,模拟人工计算

#include "string.h"// use for strlen function#include "stdio.h"#define  MAX 1000#define  MaxResult 2000void Calculate(char cArrA[],char cArrB[])...{    int iArrX[MAX]= ...{0};    int iArrY[MAX]= ...

coding life 4667

告别游戏卡关!用Cheat Engine 7.5修改单机游戏数据的保姆级教程(附Tutorial靶场练习)

本文提供了一份详细的Cheat Engine 7.5使用教程,帮助玩家轻松修改单机游戏数据。从基础操作到高级技巧,包括精确值扫描、模糊扫描、指针扫描和代码注入,教程还涵盖了《植物大战僵尸》和《星露谷物语》的实战案例,确保玩家能够安全、高效地优化游戏体验。

weixin_30082367的博客 781

大整数加法

总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的和。 输入有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。输出一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。样例输入 22222222222222222222 33333333333333333333 样例输出 555555555

6008

告别Inspect!用微软官方推荐的Accessibility Insights搞定WinApp自动化测试元素定位

本文介绍了如何从传统的Inspect工具升级到微软官方推荐的Accessibility Insights for Windows,以提升Windows应用自动化测试中的元素定位效率。通过详细的功能对比、安装指南和实战技巧,帮助测试工程师掌握这款现代化工具的核心优势,包括实时元素检测、属性筛选和与WinAppDriver、Appium等测试框架的无缝集成。

weixin_26749245的博客 617

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

qq_37835727的博客 7113

高精度加法模板,包装结构体

本题链接:用户登录 思路: 大整数,高精度,运算原理跟我们小学进行的笔算原理一样的,模拟一遍即可。

Angindem博客 422

卫星监测“America”级#两#栖#攻#击#舰#(LHA-6)出港

卫星监测“America”级#两#栖#攻#击#舰#(LHA-6)出港 前脚刚走,后脚又来,山姆大叔又来刷存在感,2020年7月28日,USS Ronald Reagan流窜在我国东海海区被卫星拍了下来: 2020年8月1日,最新卫星图像显示USS Ronald Reagan已经返回母港日本横须贺:距离其出港(2020年6月8日)已经过去了快两个月 然而事情并没有到此结束,“America”级#两#栖#攻#击#舰#(LHA-6)选择在 “八.一” 这个特殊的日子前后出港颇具挑衅的味道。 根据2020年

qq_46071146的博客 1564

高精度运算 (参考模板...仅供参考)

比较简短的高精度加法和减法运算模板。大除法的日后更新。 1 /* 两个非负的大整数相加 */ 2 void big_plus(char a[],char b[],char ans[]) 3 { 4 int c[N],d[N]; 5 memset(c,0,sizeof(c)); memset(d,0,sizeof(d));//数组初始化 6 i...

weixin_30337251的博客 82

ESP32锂电池电量检测实战:从引脚选择到低功耗优化(附完整电路图)

本文详细介绍了ESP32锂电池电量检测的实战方案,从ADC引脚选择到低功耗优化,提供完整的电路图和代码实现。通过MOS管智能开关和深度睡眠技术,显著降低静态功耗至0.5μA,提升设备续航能力。适合物联网开发者解决电量检测中的常见问题。

weixin_28731223的博客 459

踩坑记录:服务商模式下微信小程序支付,为什么必须用子商户的AppID获取openid?

本文深入解析了服务商模式下微信小程序支付必须使用子商户AppID获取openid的技术原因,详细对比了服务商模式与直连模式的关键差异,并提供了正确的配置指南和常见问题解决方案,帮助开发者避免微信支付集成中的常见陷阱。

weixin_28318011的博客 548

POJ1.6 10 大整数加法

POJ1.6 10大整数加法

leizhehan的博客:(你可能会认得我的另一个名字:hsfzLZH1) 2853

kaggle学习笔记-餐厅数据挖掘

分析Zomato数据集的基本思想是为了公平地了解影响在班加罗尔不同地方建立不同类型餐厅的因素,每个餐厅的总评级,班加罗尔是这样一个城市,拥有超过12,000家餐厅,餐厅供应来自世界各地的菜肴。每天都有新的餐馆开业,这个行业还没有饱和,需求也在与日俱增。然而,尽管需求不断增加,新餐馆却很难与老牌餐馆竞争。大多数餐厅都供应同样的食物。班加罗尔是印度的IT之都。这里的大多数人主要依靠餐馆的食物,因为他们没有时间自己做饭。由于对餐馆的需求如此巨大,因此研究一个地方的人口统计学就变得很重要。

优快云XXCQ的博客 1861

大数10进制转16进制

进制转换是非常重要的内容,考察基本功,4月底在字节跳动的春招笔试中做到了进制转换的题,不过是大整数的进制转换。 题目大意: 十进制数转16进制,会出现超大数字的情况,大小超过64位正整数的表示范围,不能使用系统库进行进制转换。 输入: 一个十进制数字 输出: 输出该十进制数对应的16进制数。 大概有以下几种解法: (1)当场手写大整数包(C++); (2)模拟大整数的笔算(模拟小学学的除法...

Ideaddxxpp的博客 3542

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

高精度加减乘除

大整数的存储:将数反着存入数组 加法运算: 模拟人工加法的过程 vector<int> add(vector<int> &A ,vector<int> &B){ vector<int> C; int t = 0; for(int i = 0;i < A.size()||i < B.size();i++){ if(i < A.size()) t += A[i]; if(i

QWERKSDFMKD的博客 281

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

NYOJ 28 大数阶乘(C语言)

题目:NYOJ 28 大数阶乘 刚学会用java,就用java写了个,真方便啊 2018.5.3 写的第一个大数的问题,刚开始感觉无从下手,主要还是刚刚接触,还需要多加练习,加油吧! 思路:利用数组模拟笔算过程 #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; #defin...

ljyanjy 758

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C语言解题—— 整数a+b(大数运算)

每天更新一道OJ题目,今日介绍简单整数和大数加法的使用方法和示例。I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.这里使用多种解法来对其进行编译。示例:The first line of the input contains an integer T(1...

Xa_L 2978

计算2的n次方(大整数乘法)

计算2的n次方,n<=10000。

2403_87130085的博客 436

POJ 1001 求高精度幂

高精度问题  初学的时候觉得很恶心。 去掉小数点,原数组存在另一个数组,将小数点标记。 用中间数组进行存储,模仿笔算乘法 去掉前导0 后导0 用up down  #include #include #include using namespace std; #define MAX 26*5 char str[6]; int res[MAX],a[MAX],b[

DisCrany的博客 473

高精度乘法———列表法

/*列表法——高精度乘法*/ #include<stdio.h> #include<string.h> #define maxsize 101 void compute(char *a,char *b,char *c){ int i,j,carry,sum,m=strlen(a)-1,n=strlen(b)-1; for(i=0;i<=m;i++)a[i]-='0'; f

Loe_Pold的博客 707

100以内偶数之积

我们只需要将每一次计算后的值都存放在结果数组中,然后用数组每一位分别跟要相乘的数作乘(就不会发生乘的结果超出类型范围的错误,就算是算到几万以内的偶数积用int也远远足够了)。当然这只是一个没有学过算法的萌新自己琢磨的,复杂度还是偏高的(肯定有更加好的方法),但对于刚接触的朋友来说应该还是有所帮助的,如果有大佬路过的话请指教指教(膜拜)。最后因为我们是从数组的最后一位开始计算的,所以数组的前面会有很多位为0,我们需要先找到有效位再进行结果的输出。

yimengg的博客 2358

C++高精度算法的简单实现

这里只给出加法的计算说明,其他的以此类推,减法与加法基本一致。乘法和除法略有不同,通过示例图表示也复杂,还不如通过代码去理解,本质的方法就是模拟笔算的立竖式计算。为了保证代码相对简单,当b长度较小时可能会做一些多余的计算,不影响结果。原理就不做具体介绍了,四种计算的核心都是模拟立竖式计算。两个任意n位数的减法,数字1大于数字2。长度记录在数组第一个元素中。采用了升阶+减法实现。

2501_94114815的博客 46

C语言羁绊之高精度乘法计算

很大一部分借鉴了(C语言的高精度算法)这一博客,你们可以去看看。欢迎指正!!!1,定义    对于计算机无法用普通数据类型(如:longint)表示的大整数进行乘法运算,称为高精度算法。这里的高精度乘法主要指按位模拟运算,实际上就是模拟乘法的过程,也就是笔算的过程。(你拿张纸就可以轻易的模拟出来,但是你原来可能没发现过其中的规律)。2,原理    既然是一个很大的数,我们便不能够在用简单的数据类型...

zlhcsm的博客 1603

(浮点数及整数)高精度乘除法

思想 高精度计算的核心思想很简单,就是模拟我们笔算的过程,因此,关键在于如何准确地模拟笔算基础代码 因为高精度乘除法中会用到高精度加减法和比较大小函数,所以就先把加减和比较函数贴出来咯int compare(string str1,string str2) //比较字符串型的“数字”大小,相等返回0,大于返回1,小于返回-1 { if (str1.length() > str2.le

鲜橙的思维空间 3262

关于大整数的加减乘除求余运算 java

自己用java 实现了大字符串整数的加减乘除和求余运算, 加减法的算法是模拟手工笔算的计算过程, 除法就是从最高位不停的减操作, 乘法的算法 :遍历一个数的各个位数以及他所在位置,另一个数根据这个数的位置末位添n个0,然后累加次数为这个位置数的数值 原创代码如下: public class Demo6 { public static void main(String[]ar...

weixin_30468137的博客 118

[置顶] 大整数乘法

问题描述 求两个不超过 200 位的非负整数的积。 输入数据 有两行,每行是一个不超过 200 位的非负整数,没有多余的前导0。 输出要求 一行,即相乘后的结果。结果里不能有多余的前导 0,即如果结果是342,那么就不能 输出为0342。 输入样例 12345678900 98765432100 输出样例 ...

weixin_34006468的博客 115
上一篇: USACO Milking Cows
下一篇: KMP代码及思路解析
windroid
博客等级 码龄12年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值