UVA10523 高精度(2)+相乘、相加+注意进位和0的情况
来源:互联网 发布:什么数据库好用 编辑:程序博客网 时间:2024/05/22 09:24
1 题意。
2分析。
3
代码一是面向过程,代码二是面向对象写法。
代码一(来自小白菜又菜的代码,非常简洁,用于一个大数和一个int数的乘法、大数相加,相乘的代码告诉我们相乘的实质实际上就是一个数分别乘上另一个数的各个位,用数组保存,然后得到的数组从低位开始向高位滚动,满10进1。向其学习)
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int maxn=210;int a[maxn];int sum[maxn];int main(){ int n,num; while(~scanf("%d%d",&n,&num)){ memset(a,0,sizeof(a)); memset(sum,0,sizeof(sum)); sum[0]=a[0]=num; for(int i=2;i<=n;i++){ for(int j=0;j<=200;j++) a[j]*=num; ///a[j]*=i;不能紧随其后,连乘是不可以的 for(int j=0;j<=200;j++){ ///和上一个for是不能一起写的!,否则丢失进位 a[j+1]+=a[j]/10; a[j]%=10; } /* 错的:如果把a[j]破坏了,那还怎么连乘算a^1,a^2,a^3... for(int j=0;j<=200;j++) a[j]*=i; for(int j=0;j<=200;j++){ a[j+1]+=a[j]/10; a[j]%=10; } */ for(int j=0;j<=200;j++){ sum[j]+=a[j]*i; sum[j+1]+=sum[j]/10; sum[j]%=10; } } int bj=0; for(int j=200;j>=0;j--){ if(sum[j]!=0) bj=1; if(bj) cout<<sum[j]; } cout<<endl; }}
代码二
//未去前导0,可以将int类型的数转为Bignum(num_bignum函数);可以将char[]类型的数串转为Bignum。#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;const int maxn=1010;///注意调整class Bignum{private: int len; int a[maxn];public: Bignum(){//initialization memset(a,0,sizeof(a)); len=0; } bool isZero(){ return len==1&&a[0]==0; } void num_bignum(int s){ len=0; if(s==0) a[len++]=0;//防止s==0 for(;s>0;){ a[len++]=s%10; s/=10; } } void str_bignum(char s[]){ len=0; for(int i=strlen(s)-1;i>=0;i--){ a[len++]=s[i]-'0'; } } void add(Bignum &x){ for(int i=0;i<x.len;i++){ a[i]+=x.a[i]; a[i+1]+=a[i]/10; a[i]%=10; } int k=x.len; while(a[k]){ //高位进1处理(9+99999=...) a[k+1]+=a[k]/10; //注意不是++,因为可能不需要进位;注意是+=,而非= a[k]=a[k]%10; k++; } //len=k; 不能这么写,前面进1处理可能是,9+13333=04333 (//左对齐计算) len=len>k?len:k; } void multi(Bignum &x){ if(x.isZero()){ num_bignum(0); } int product[maxn]; memset(product,0,sizeof(product)); for(int i=0;i<len;i++){ for(int j=0;j<x.len;j++){ product[i+j]+=a[i]*x.a[j]; } } int k=0; while(k<len+x.len-1){ //每一位规范为10进制 product[k+1]+=product[k]/10; product[k++]%=10; } while(product[k]){ //最高位进1处理(不能用这个while与k=0结合代替上一个规范十进制的数,因为可能碰到中间的数为0就停止往前滚动) product[k+1]+=product[k]/10; product[k]%=10; k++; } len=k; memcpy(a,product,sizeof(product));//product -> a } void print(){ for(int i=len-1;i>=0;i--){ cout<<a[i]; } cout<<endl; }};int main(){ int n; char s[maxn]; while(scanf("%d%s",&n,s)!=EOF){ Bignum a,b,sum; b.str_bignum(s);//幂 a.num_bignum(1);//底数 sum.num_bignum(0); for(int i=1;i<=n;i++){ Bignum num; num.num_bignum(i); a.multi(b);//a^1,a^2,...a^n num.multi(a);//i*(a^i) sum.add(num); } sum.print(); }}
0 0
- UVA10523 高精度(2)+相乘、相加+注意进位和0的情况
- 多项式的相乘和相加
- 25与一个三位数相乘个位是0,与这个三位数相加有且只有1次进位,像这样的三位数总共有多少个?C#实现
- 两个矩阵的相加和相乘
- 数据结构-链表-多项式的相乘和相加
- 大数相乘和相加
- 大数相加 和 相乘
- 数学题-大数据的相加和相加(HDOJ1002(相加)(HDOJ 1042(相乘)
- 【水】高精度下进位的处理方法
- 数据结构 -- 多项式相加和相乘
- 大数相加和大数相乘
- 大数相乘和大数相加
- 字符串大数相加和相乘
- 大数问题-相加和相乘
- 数据结构课程设计一元多项式的相加和相乘
- 数据结构实验1(一元多项式的相加和相乘)
- 大整数的相加、相减和相乘
- 两个多项式相乘和相加的java实现
- Yum只下载不安装包
- SATA结构
- C++编程守则—尽量以const,enum,inline替换#define
- matlab常用快捷键
- BZOJ 3893 [Usaco2014 Dec]Cow Jog
- UVA10523 高精度(2)+相乘、相加+注意进位和0的情况
- Jeff Dean的神话
- Java中String的常用操作
- 《C++Primer Plus6》(1~4章)复习总结(三)
- 安卓学习第一天
- JZOJ4869【NOIP2016提高A组集训第9场11.7】平均数
- Google Protocol Buffer 学习
- 研究谷歌和亚马逊的微服务案例,我们能学习到的经验
- 一天一条Linux指令-kill