内容 :

在大多數的程式語言中,一個整數通常只有32位元,就算是使
用無號的整數,仍然最大只能表示232-1。若要表示一個大於232-1的
整數該怎麼辦呢?答案就是採用大數。本題要求寫出一個大數運算的
程式,可以對二個50位數以內的10進制非負整數作乘法或除法的運
算。除法運算時,毋須考慮除數為0的情形,並僅需算出商數。

输入说明 :

第一行輸入一個字串,表示被乘數或被除數,其為一個50位數
以內的10進制非負整數。

第二行輸入運算符號 * 或 /,分別表示乘法或除法運算。

第三行輸入一個字串,表示乘數或除數,其為一個50位數以內
的10進制非負整數。當執行除法運算時,除數為正整數。

输出说明 :


印出運算結果。

范例输入 :

12346587987654321
*
98765432123456789
12345678901234567890
/
1234567890 

范例输出 :

1219416097850959788293446112635269
10000000001

提示 :

出处 :

2008 TOI 研習營初選
  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 大数运算相关推荐

  1. C语言实现大数运算(长整数的加、减、乘、除)

    由于整型数的位数有限,因此整型数不能满足大整数(超长整数)的运算要求 .大整数计算是利用字符串来表示大整数,即用字符串的一位字符表示大整数的一位数值,然后根据四则运算规则实现大整数的四则运算. 简单表 ...

  2. C语言学习趣事_之_大数运算_加法

    C语言学习趣事_大数运算_之加法 1.引子    在C语言中,因为预定义的自然数类型的大小是有上下限度的,这就决定了在进行数的运算的时候,必然受到限制,同时因为C语言是最接近汇编的一种程序设计语言,并 ...

  3. java中大数开方_Java中的大数运算

    # 一:大数运算出现的背景 java里面整型int与浮点型float,double它们存放数据的范围是有限的,当出行更大的数值时会发生溢出. 最典型的场景是金融行业,直接使用单精度或者双精浮点数来表示 ...

  4. Openssl 之大数运算函数 BN

    Openssl 之大数运算函数 BN 主要介绍Openssl中的有关大数运算函数,这个对于RSA研究和实现比较有价值   1.初始化函数 BIGNUM *BN_new(void);    新生成一个B ...

  5. 【PAT甲级 大数运算】1065 A+B and C (64bit) (20 分) Python 全部AC

    题目 初学python,第一次用python刷oj,挑了个简单题试试手. 在大数运算方面,python没有数的大小限制,简直开挂. total = int(input()) for i in rang ...

  6. Java的学习与java大数运算

    之前就学过一点java,但太久没用知识点早就还给书本,之前在实验室搞到一本java的书,今天来重新温习一下 java的语法大部分和c++语言是一样的,入门非常快,所以在这里基础语句的用法就省略了 输出 ...

  7. 备忘: MIRACL 大数运算库使用手册

    <MIRACL 大数运算库使用手册> 作者: 游贵荣 中文使用手册: http://blog.csdn.net/shuilan0066/article/details/8520337htt ...

  8. 算法之大数运算加减法源代码

    很多小伙伴对计算机编程的算法感兴趣,但在很多竞赛类算法网站中,大数运算往往是必考的,而课本有基本未提及,所以,今天来提供算法的基本运算的源码(加减). 对于大多数大数运算,往往是超出int 的范围,比 ...

  9. 黄金连分数(斐波那契数列、大数运算)正确解法

    标题: 黄金连分数     黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太 ...

最新文章

  1. 软件体系架构模式之一什么是软件架构模式
  2. Michael Jordan获2020IEEE冯诺依曼奖,曾培养吴恩达、Bengio
  3. system v和posix的共享内存对比 共享内存位置
  4. 在Docker中体验数据库之MySql
  5. Veronica博士的研究方向的介绍
  6. 数据结构,Java实现递归回溯,寻找出迷宫路线,解决迷宫问题
  7. vue3开发实践笔记
  8. Teradata天睿公司任命Steve McMillan为总裁兼首席执行官
  9. 怒江java培训班_怒江万词霸屏是什么意思
  10. MySQL知识点查阅
  11. kafka 的pom文件_Flink的sink实战之二:kafka
  12. centos配置kdump捕获内核崩溃
  13. java类图_java类图制作 - lxw12138的个人空间 - OSCHINA - 中文开源技术交流社区
  14. 金立android手机怎么截图,金立M6手机怎么截图 金立M6截屏/截图方法(两种)
  15. C++控制台五子棋(带背景音乐)
  16. 软件定义网络(PART 3)
  17. web入门 命令执行 web29-web41
  18. STM32f103 SMO滑膜观测器的 无感无刷FOC驱动DIY
  19. 云服务器带宽解释及下载速度分析
  20. 常见的几种服务器/客服端模型

热门文章

  1. 【ADRC】扩张状态观测器(ESO)
  2. 英语Barklyite红宝石barklyite
  3. 服务器关闭微软小娜,win10小娜总是自动弹出怎么禁止-禁止win10小娜自动弹出的方法 - 河东软件园...
  4. HTTP常见请求头/响应头
  5. 解决idea在运行时出现Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8?
  6. JavaWEB十五:QQzone项目的整体分析及web关键点总结
  7. JPA系列:使用原生SQL、使用JPQL查询方法简单例子
  8. 我用20种编程语言送上新年的祝福,Happy new year!
  9. python 爬虫 JA3 指纹 TCL SSL 安全证书问题
  10. 用python做网站优点_php和django做网站哪个好