TOI2008 大数运算
内容 :
用無號的整數,仍然最大只能表示232-1。若要表示一個大於232-1的
整數該怎麼辦呢?答案就是採用大數。本題要求寫出一個大數運算的
程式,可以對二個50位數以內的10進制非負整數作乘法或除法的運
算。除法運算時,毋須考慮除數為0的情形,並僅需算出商數。
输入说明 :
以內的10進制非負整數。
第二行輸入運算符號 * 或 /,分別表示乘法或除法運算。
第三行輸入一個字串,表示乘數或除數,其為一個50位數以內
的10進制非負整數。當執行除法運算時,除數為正整數。
输出说明 :
印出運算結果。
范例输入 :
12346587987654321 * 98765432123456789 12345678901234567890 / 1234567890
范例输出 :
1219416097850959788293446112635269 10000000001
提示 :
出处 :
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cmath> 6 using namespace std; 7 int max(int a,int b) { 8 return a>b?a:b; 9 } 10 int min(int a,int b) { 11 return a<b?a:b; 12 } 13 /*高精度整数的数据结构*/ 14 struct Huge { 15 int num[10000]; 16 int len; 17 char sign; 18 }; 19 /*高精度正数除法的数据结构*/ 20 struct DivMod { 21 struct Huge div; 22 struct Huge mod; 23 }; 24 /*清零,将st初始化为0*/ 25 struct Huge Init(void) { 26 struct Huge st; 27 st.sign='+'; 28 st.num[0]=0; 29 st.len=1; 30 return st; 31 } 32 /*将init初始化为st,假设st中全部为数字*/ 33 struct Huge Init(const char *st) { 34 struct Huge init; 35 memset(init.num,0,sizeof(init.num)); 36 init.len=strlen(st); 37 for(int i=0;i<=strlen(st)-1;i++) 38 init.num[i]=st[strlen(st)-1-i]-'0'; 39 return init; 40 } 41 /*将init初始化为n*/ 42 struct Huge Init(int n) { 43 struct Huge init;memset(init.num,0,sizeof(init.num)); 44 init.len=0; 45 while(n>0) { 46 init.num[init.len++]=n%10; 47 n/=10; 48 } 49 return init; 50 } 51 /*比较x与y的大小,返回:值为1,x>y;值为0,x==y;值为-1,x<y*/ 52 int CompareHuge(struct Huge x, struct Huge y) { 53 int i; 54 if (x.len>y.len) return 1; 55 if (x.len<y.len) return -1; 56 for (i=x.len-1;x.num[i]==y.num[i]&&i>=0;i--); 57 if (i<0) return 0; 58 else return (x.num[i]>y.num[i]?1:-1); 59 } 60 /*交换两个数*/ 61 void swap(struct Huge &x,struct Huge &y) { 62 struct Huge temp; 63 temp=x;x=y;y=temp; 64 } 65 /*返回:x向左移动y位后的结果(y>0)多出的位数,填0.*/ 66 struct Huge LeftShift(struct Huge x, int y) { 67 int i; 68 if(CompareHuge(x,Init())==0) return x; 69 x.len+=y; 70 for (i=x.len-1;i>=y;i--) x.num[i]=x.num[i-y]; 71 for (;i>=0;i--) x.num[i]=0; 72 return x; 73 } 74 /*返回:x向右移动y位后的结果(y>0)少的位数,丢弃.*/ 75 struct Huge RightShift(struct Huge x, int y) { 76 if(CompareHuge(x,Init())==0) return x; 77 for(int i=0;i<=x.len-y-1;i++) x.num[i]=x.num[i+y]; 78 if(x.len>y) x.len-=y; 79 else x=Init(); 80 return x; 81 } 82 /*打印高精度整数print的内容*/ 83 void PrintHuge(struct Huge print) { 84 if(print.sign=='-') cout<<print.sign; 85 for(int i=print.len-1;i>=0;i--) cout<<print.num[i]; 86 cout<<endl; 87 } 88 /*加法运算,返回x+y*/ 89 struct Huge add(struct Huge x, struct Huge y) { 90 struct Huge ans; memset(ans.num,0,sizeof(ans.num)); 91 ans.sign='+'; 92 ans.len=max(x.len,y.len); 93 for(int i=0;i<ans.len;i++) { 94 if (i<=x.len-1 && i<=y.len-1) 95 ans.num[i]+=x.num[i]+y.num[i]; 96 else { 97 if (i>x.len-1) ans.num[i]+=y.num[i]; 98 else ans.num[i]+=x.num[i]; 99 } 100 if(ans.num[i]>=10) { 101 ans.num[i+1]++; 102 ans.num[i]%=10; 103 } 104 } 105 if(ans.num[ans.len]>0) ans.len++; 106 return ans; 107 } 108 /*减法运算,返回x-y*/ 109 struct Huge sub(struct Huge x,struct Huge y) { 110 struct Huge ans;memset(ans.num,0,sizeof(ans.num)); 111 if(CompareHuge(x,y)==0) return Init(); 112 if(CompareHuge(x,y)==-1) { 113 ans.sign='-'; 114 swap(x,y); 115 } 116 ans.len=x.len; 117 for(int i=0;i<ans.len;i++) { 118 if (i<y.len) ans.num[i]+=x.num[i]-y.num[i]; 119 else ans.num[i]+=x.num[i]; 120 if (ans.num[i]<0) {ans.num[i+1]--;ans.num[i]+=10;} 121 } 122 int i; 123 for(i=ans.len-1;ans.num[i]==0;i--); 124 ans.len=i+1; 125 return ans; 126 } 127 /*乘法运算,返回a*b*/ 128 /*高精度数据乘单精度数据(个位数)运算 */ 129 struct Huge multi(struct Huge x, int y) { 130 struct Huge ans; 131 memset(ans.num,0,sizeof(ans.num)); ans.sign='+'; 132 if (y==0) return Init(); 133 ans.len=x.len; 134 for (int i=0;i<ans.len;i++) { 135 ans.num[i]+=x.num[i]*y; 136 if(ans.num[i]>=10) { 137 ans.num[i+1]+=ans.num[i]/10; 138 ans.num[i]%=10; 139 } 140 } 141 if(ans.num[ans.len]>0) ans.len++; 142 return ans; 143 } 144 /*高精度数据乘高精度数据运算*/ 145 struct Huge multi(struct Huge x,struct Huge y) { 146 struct Huge ans; 147 memset(ans.num,0,sizeof(ans.num)); ans.sign='+'; 148 ans.len=x.len; 149 for(int i=0;i<y.len;i++) 150 ans=add(ans,LeftShift(multi(x,y.num[i]),i)); 151 for(int i=0;i<ans.len;i++) 152 if(ans.num[i]>=10) { 153 ans.num[i+1]+=ans.num[i]/10; 154 ans.num[i]%=10; 155 } 156 if(ans.num[ans.len]>0) ans.len++; 157 return ans; 158 } 159 /*除法运算,返回 a/b与a%b*/ 160 struct DivMod divmod(struct Huge x,struct Huge y) { 161 struct DivMod ans;int i,tmp; 162 ans.div.sign='+';ans.mod.sign='+'; 163 ans.div=Init(); 164 ans.mod=Init(); 165 if(y.len>x.len) { 166 ans.mod=x; 167 return ans; 168 } 169 i=x.len-y.len; 170 y=LeftShift(y,i); 171 for(;i>=0;i--) { 172 tmp=0; 173 while(CompareHuge(x,y)>=0) x=sub(x,y),tmp++; 174 ans.div=LeftShift(ans.div,1); 175 ans.div.num[0]=tmp; 176 y=RightShift(y,1); 177 } 178 ans.mod=x; 179 return ans; 180 } 181 /*取商*/ 182 struct Huge Div(struct Huge x,struct Huge y) { 183 struct DivMod ans=divmod(x,y); 184 return ans.div; 185 } 186 /*主函数*/ 187 int main() { 188 struct Huge a,b; 189 char t1[1001],t2[1001],fh; 190 a.sign='+',b.sign='+'; 191 while(scanf("%s\n%c\n%s\n",t1,&fh,t2)!=EOF) { 192 a=Init(t1); 193 b=Init(t2); 194 if(fh=='*') PrintHuge(multi(a,b)); 195 if(fh=='/') PrintHuge(Div(a,b)); 196 } 197 return 0; 198 }
转载于:https://www.cnblogs.com/TonyNeal/archive/2013/06/06/TOI20082.html
TOI2008 大数运算相关推荐
- C语言实现大数运算(长整数的加、减、乘、除)
由于整型数的位数有限,因此整型数不能满足大整数(超长整数)的运算要求 .大整数计算是利用字符串来表示大整数,即用字符串的一位字符表示大整数的一位数值,然后根据四则运算规则实现大整数的四则运算. 简单表 ...
- C语言学习趣事_之_大数运算_加法
C语言学习趣事_大数运算_之加法 1.引子 在C语言中,因为预定义的自然数类型的大小是有上下限度的,这就决定了在进行数的运算的时候,必然受到限制,同时因为C语言是最接近汇编的一种程序设计语言,并 ...
- java中大数开方_Java中的大数运算
# 一:大数运算出现的背景 java里面整型int与浮点型float,double它们存放数据的范围是有限的,当出行更大的数值时会发生溢出. 最典型的场景是金融行业,直接使用单精度或者双精浮点数来表示 ...
- Openssl 之大数运算函数 BN
Openssl 之大数运算函数 BN 主要介绍Openssl中的有关大数运算函数,这个对于RSA研究和实现比较有价值 1.初始化函数 BIGNUM *BN_new(void); 新生成一个B ...
- 【PAT甲级 大数运算】1065 A+B and C (64bit) (20 分) Python 全部AC
题目 初学python,第一次用python刷oj,挑了个简单题试试手. 在大数运算方面,python没有数的大小限制,简直开挂. total = int(input()) for i in rang ...
- Java的学习与java大数运算
之前就学过一点java,但太久没用知识点早就还给书本,之前在实验室搞到一本java的书,今天来重新温习一下 java的语法大部分和c++语言是一样的,入门非常快,所以在这里基础语句的用法就省略了 输出 ...
- 备忘: MIRACL 大数运算库使用手册
<MIRACL 大数运算库使用手册> 作者: 游贵荣 中文使用手册: http://blog.csdn.net/shuilan0066/article/details/8520337htt ...
- 算法之大数运算加减法源代码
很多小伙伴对计算机编程的算法感兴趣,但在很多竞赛类算法网站中,大数运算往往是必考的,而课本有基本未提及,所以,今天来提供算法的基本运算的源码(加减). 对于大多数大数运算,往往是超出int 的范围,比 ...
- 黄金连分数(斐波那契数列、大数运算)正确解法
标题: 黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太 ...
最新文章
- 软件体系架构模式之一什么是软件架构模式
- Michael Jordan获2020IEEE冯诺依曼奖,曾培养吴恩达、Bengio
- system v和posix的共享内存对比 共享内存位置
- 在Docker中体验数据库之MySql
- Veronica博士的研究方向的介绍
- 数据结构,Java实现递归回溯,寻找出迷宫路线,解决迷宫问题
- vue3开发实践笔记
- Teradata天睿公司任命Steve McMillan为总裁兼首席执行官
- 怒江java培训班_怒江万词霸屏是什么意思
- MySQL知识点查阅
- kafka 的pom文件_Flink的sink实战之二:kafka
- centos配置kdump捕获内核崩溃
- java类图_java类图制作 - lxw12138的个人空间 - OSCHINA - 中文开源技术交流社区
- 金立android手机怎么截图,金立M6手机怎么截图 金立M6截屏/截图方法(两种)
- C++控制台五子棋(带背景音乐)
- 软件定义网络(PART 3)
- web入门 命令执行 web29-web41
- STM32f103 SMO滑膜观测器的 无感无刷FOC驱动DIY
- 云服务器带宽解释及下载速度分析
- 常见的几种服务器/客服端模型
热门文章
- 【ADRC】扩张状态观测器(ESO)
- 英语Barklyite红宝石barklyite
- 服务器关闭微软小娜,win10小娜总是自动弹出怎么禁止-禁止win10小娜自动弹出的方法 - 河东软件园...
- HTTP常见请求头/响应头
- 解决idea在运行时出现Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8?
- JavaWEB十五:QQzone项目的整体分析及web关键点总结
- JPA系列:使用原生SQL、使用JPQL查询方法简单例子
- 我用20种编程语言送上新年的祝福,Happy new year!
- python 爬虫 JA3 指纹 TCL SSL 安全证书问题
- 用python做网站优点_php和django做网站哪个好