博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高精度A+B、A-B、A*B
阅读量:3966 次
发布时间:2019-05-24

本文共 4107 字,大约阅读时间需要 13 分钟。

文章目录


前言

提示:以下是本篇文章正文内容,下面案例可供参考

一、高精加

#include 
using namespace std;int ab[5005];//存储这个大数的每一位,0-len 从个位到高位string a,b;//定义两个字符串来存储一个大数int main(){
cin>>a>>b;//输入这两个大数 int lena=a.size();//算出大数a的位数 int lenb=b.size();//算出大数b的位数 int len= max(lena,lenb);//两个数的最大数 if(lena>=lenb) {
//用较大的大数加较小的大数 for (int i = 0; i < lena; ++i) {
//将第一个数的每一位转换为int型数字,再存入数组 ab[i] = a[lena - 1 - i] - 48; } for (int i = 0; i < lenb; ++i) {
//将第二个数的每一位转换为int型数字,与第一位的数字相加,再存入数组 ab[i]+= b[lenb - 1 - i] - 48; } } else{
for (int i = 0; i < lenb; ++i) {
//将第一个数的每一位转换为int型数字,再存入数组 ab[i] = b[lenb - 1 - i] - 48; } for (int i = 0; i < lena; ++i) {
//将第二个数的每一位转换为int型数字,与第一位的数字相加,再存入数组 ab[i]+= a[lena - 1 - i] - 48; } } for (int i = 0; i
=10){
ab[i]-=10; ab[i+1]++; } } while(a[len]>0){
//判断最大位的上一位是否大于0,如果大于,位数就加 len++; } for(int i=len-1;i>=0;i--){
//最后从最高位开始输出 cout<

二、高精减

代码如下(示例):

#include 
using namespace std;int ab[5005];//存储这个大数的每一位,0-len 从个位到高位string a,b;//定义两个字符串来存储一个大数int main(){
cin>>a>>b;//输入这两个大数 int lena=a.size();//算出大数a的位数 int lenb=b.size();//算出大数b的位数 int len= max(lena,lenb);//两个数的最大数 if(lena>=lenb) {
//用较大的大数减较小的大数 for (int i = 0; i < lena; ++i) {
//将第一个数的每一位转换为int型数字,再存入数组 ab[i] = a[lena - 1 - i] - 48; } for (int i = 0; i < lenb; ++i) {
//将第二个数的每一位转换为int型数字与第一位数字相减,再存入数组 ab[i]-= b[lenb - 1 - i] - 48; } } else{
for (int i = 0; i < lenb; ++i) {
//将第一个数的每一位转换为int型数字,再存入数组 ab[i] = b[lenb - 1 - i] - 48; } for (int i = 0; i < lena; ++i) {
//将第二个数的每一位转换为int型数字与第一位数字相减,再存入数组 ab[i]-= a[lena - 1 - i] - 48; } } for (int i = 0; i
=0;i--){
//最后从最高位开始输出 cout<

三、高精乘

代码如下(示例):

#include 
#include
using namespace std;int a1[5005],b1[5005],c[5005];//存储这个大数的每一位,0-len 从个位到高位char a[5005],b[5005];//定义两个字符串来存储一个大数int main(){
cin>>a>>b;//输入这两个大数 int lena=strlen(a);//算出大数a的位数 int lenb=strlen(b);//算出大数b的位数 int len= lena+lenb;//两个数的最大数 for (int i = 1; i <=lena; ++i) {
//将第一个数的每一位转换为int型数字,再存入数组 a1[i] = a[lena - i] - 48; } for (int i = 1; i <= lenb; ++i) {
//将第二个数的每一位转换为int型数字与第一位数字相减,再存入数组 b1[i]= b[lenb - i] - 48; } for (int i = 1; i <=lena ; ++i) {
for (int j = 1; j <= lenb; ++j) {
c[i+j-1]+=a1[i]*b1[j];//相乘后的两个数加入c[] i位的数乘以j为的数,的位数在i+j-1位 } } for(int i=1;i
9){
//模拟乘法进位 c[i+1]+=c[i]/10; c[i]%=10; } } while(c[len]==0&&len>1) len--;//判断最高位的下一位是否为0,是的话,位数就减一 for(int i=len;i>=1;i--){
//最后从最高位开始输出 cout<

四、阶乘之和利用高精加和高精乘

1.

#include "iostream"using namespace std;int a[101],s[101];void cf(int x){
int jz=0;//进制 for (int i = 100; i >=0 ; --i) {
a[i]=a[i]*x+jz;//每次乘了之后再加进制 jz=a[i]/10;//进制为超过10的数 a[i]%=10;//取余后为这个位置的数 }}void jf(){
int jz=0;//进制 for (int i = 0; i <=100 ; ++i) {
s[i]+=a[i]+jz;//模拟加法进制 jz=s[i]/10; s[i]%=10; }}void sc(){
int w; for (int i = 0; i <=100 ; ++i) {
if(s[i]!=0){
//找到第一个不为0的数 w=i; break; } } for(int i=w;i<=100;i++){
//从第一个不为0的数开始输出 cout<
>n;//求n的阶乘之和 for (int i = 2; i <=n ; ++i) {
cf(i);//先乘 jf();//再加 } sc();//输出 return 0;}

2.

#include 
using namespace std;int a[10000];int main(){
int t,n,num; cin>>t; while(t--) {
int i,j; for(i=1;i<=1010;i++) a[i]=0; a[1]=1; long long cnt=0; int p=1; cin>>n>>num; for(i=2;i<=n;i++) {
int jw=0; for(j=1;j<=p;j++) {
a[j]=a[j]*i+jw; jw=a[j]/10; a[j]%=10; } while(jw>0) {
a[j]=jw%10; jw/=10; j++; } p=j-1; } for(int k=1;k<=p;k++) {
if(a[k]==num) cnt++; } cout<
<

转载地址:http://pbjki.baihongyu.com/

你可能感兴趣的文章
深入理解指针函数
查看>>
深入理解指针函数
查看>>
Linux&nbsp;init详解
查看>>
Linux&nbsp;init详解
查看>>
const与define
查看>>
const与#define
查看>>
嵌入式C语言面试题(一)
查看>>
const与define
查看>>
嵌入式C语言面试题(二)
查看>>
嵌入式C语言面试题(一)
查看>>
大学生毕业后的工作与生活
查看>>
嵌入式C语言面试题(二)
查看>>
2440IIC驱动
查看>>
大学生毕业后的工作与生活
查看>>
2440&nbsp;iic&nbsp;驱动
查看>>
2440IIC驱动
查看>>
s3c2440驱动
查看>>
2440&nbsp;iic&nbsp;驱动
查看>>
s3c2440驱动
查看>>
u-boot&nbsp;lds文件详解
查看>>