1.大数的加法

语法:add(char a[],char b[],char s[]);

参数:

a[]:被加数,用字符串表示,位数不限

b[]:加数,用字符串表示,位数不限

s[]:结果,用字符串表示

返回值:null

注意:

空间复杂度为 o(n^2)

需要 string.h

源程序:

 void add(char a[],char b[],char back[])

      {

          int i,j,k,up,x,y,z,l;

          char *c;

          if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;

          c=(char *) malloc(l*sizeof(char));

          i=strlen(a)-1;

          j=strlen(b)-1;

          k=0;up=0;

          while(i>=0||j>=0)

              {

                  if(i<0) x='0'; else x=a[i];

                  if(j<0) y='0'; else y=b[j];

                  z=x-'0'+y-'0';

                  if(up) z+=1;

                  if(z>9) {up=1;z%=10;} else up=0;

                  c[k++]=z+'0';

                  i--;j--;

              }

          if(up) c[k++]='1';

          i=0;

          c[k]='\0';

          for(k-=1;k>=0;k--)

              back[i++]=c[k];

          back[i]='\0';

      }

2.大数的减法 (未处理负数情况)

语法:sub(char s1[],char s2[],char t[]);

参数:

s1[]:被减数,用字符串表示,位数不限

s2[]:减数,用字符串表示,位数不限

t[]:结果,用字符串表示

返回值:null

注意:

默认s1>=s2,程序未处理负数情况

需要 string.h

源程序:

 void sub(char s1[],char s2[],char t[])
{
int i,l2,l1,k;
l2=strlen(s2);l1=strlen(s1);
t[l1]='\0';l1--;
for (i=l2-1;i>=0;i--,l1--)
{
if (s1[l1]-s2[i]>=0)
t[l1]=s1[l1]-s2[i]+'0';
else
{
t[l1]=10+s1[l1]-s2[i]+'0';
s1[l1-1]=s1[l1-1]-1;
}
}
k=l1;
while(s1[k]<0) {s1[k]+=10;s1[k-1]-=1;k--;}
while(l1>=0) {t[l1]=s1[l1];l1--;}
loop:
if (t[0]=='0')
{
l1=strlen(s1);
for (i=0;i<l1-1;i++) t[i]=t[i+1];
t[l1-1]='\0';
goto loop;
}
if (strlen(t)==0) {t[0]='0';t[1]='\0';}
}

3.大数的乘法  ---大数乘小数

语法:mult(char c[],char t[],int m);

参数:

c[]:被乘数,用字符串表示,位数不限

t[]:结果,用字符串表示

m:乘数,限定10以内

返回值:null

注意:

需要 string.h

源程序:

void mult(char c[],char t[],int m)
{
int i,l,k,flag,add=0;
char s[100];
l=strlen(c);
for (i=0;i<l;i++)
s[l-i-1]=c[i]-'0';
for (i=0;i<l;i++)
{
k=s[i]*m+add;
if (k>=10) {s[i]=k%10;add=k/10;flag=1;} else
{s[i]=k;flag=0;add=0;}
}
if (flag) {l=i+1;s[i]=add;} else l=i;
for (i=0;i<l;i++)
t[l-1-i]=s[i]+'0';
t[l]='\0';
}

4.大数的乘法  ---大数乘大数

语法:mult(char a[],char b[],char s[]);

参数:

a[]:被乘数,用字符串表示,位数不限

b[]:乘数,用字符串表示,位数不限

t[]:结果,用字符串表示

返回值:null

注意:

空间复杂度为 o(n^2)

需要 string.h

源程序:

void mult(char a[],char b[],char s[])
{
int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;
char result[65];
alen=strlen(a);blen=strlen(b);
for (i=0;i<alen;i++)
for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0');
for (i=alen-1;i>=0;i--)
{
for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j];
result[k]=sum%10;
k=k+1;
sum=sum/10;
}
for (i=blen-2;i>=0;i--)
{
for (j=0;j<=i;j++) sum=sum+res[i-j][j];
result[k]=sum%10;
k=k+1;
sum=sum/10;
}
if (sum!=0) {result[k]=sum;k=k+1;}
for (i=0;i<k;i++) result[i]+='0';
for (i=k-1;i>=0;i--) s[i]=result[k-1-i];
s[k]='\0';
while(1)
{
if (strlen(s)!=strlen(a)&&s[0]=='0')
strcpy(s,s+1);
else
break;
}
}

5.大数的阶乘

语法:int result=factorial(int n);

参数:

n:n 的阶乘

返回值:阶乘结果的位数

注意:

本程序直接输出n!的结果,需要返回结果请保留long a[]

需要 math.h

源程序:

int factorial(int n)
{
long a[10000];
int i,j,l,c,m=0,w;
a[0]=1;
for(i=1;i<=n;i++)
{
c=0;
for(j=0;j<=m;j++)
{
a[j]=a[j]*i+c;
c=a[j]/10000;
a[j]=a[j]%10000;
}
if(c>0) {m++;a[m]=c;}
} w=m*4+log10(a[m])+1;
printf("\n%ld",a[m]);
for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);
return w;
}

6.大数的比较

语法:int compare(char a[],char b[]);

参数:

a[]:被比较数,用字符串表示,位数不限

b[]:比较数,用字符串表示,位数不限

返回值: 0    a<b

1    a>b

2    a=b

源程序:

int compare(char a[], char b[])
{
int lena=strlen(a);
int lenb=strlen(b);
if(lena>lenb)
return 1;
else if(lena<lenb)
return 0;
for(int i=0;i<lena;i++)
{
if(a[i]>b[i])
return 1;
else if(a[i]<b[i])
return 0;
}
return 2;
}

C++大数问题的更多相关文章

  1. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  2. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  3. c语言经典算法——查找一个整数数组中第二大数

    题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...

  4. 杨氏矩阵:查找x是否在矩阵中,第K大数

    参考:http://xudacheng06.blog.163.com/blog/static/4894143320127891610158/ 杨氏矩阵(Young Tableau)是一个很奇妙的数据结 ...

  5. 蓝桥杯算法提高 P1001(大数乘法)

      算法提高 P1001   时间限制:1.0s   内存限制:256.0MB   当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体 ...

  6. 51nod 1005 大数加法

    #include<iostream> #include<string> using namespace std; #define MAXN 10001 },b[MAXN]={} ...

  7. PHP大数(浮点数)取余

    一般我们进行取余运算第一个想到的就是用百分号%,但当除数是个很大的数值,超出了int范围时,这样取余就不准确了. php大数(浮点数)取余函数 /** * php大数取余 * * @param int ...

  8. HDU 5686 斐波那契数列、Java求大数

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=5686 当我们要求f[n]时,可以考虑为前n-1个1的情况有加了一个1. 此时有两种情况:当不适用第n个1进 ...

  9. 区间K 大数查询

      算法训练 区间k大数查询   时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列 ...

  10. HDU 5047 Sawtooth(大数优化+递推公式)

    http://acm.hdu.edu.cn/showproblem.php?pid=5047 题目大意: 给n条样子像“m”的折线,求它们能把二维平面分成的面最多是多少. 解题思路: 我们发现直线1条 ...

随机推荐

  1. redis使用方法

    redis缓存服务器笔记 redis是一个高性能的key-value存储系统,能够作为缓存框架和队列 但是由于他是一个内存内存系统,这些数据还是要存储到数据库中的 作为缓存框架: create/upd ...

  2. PartTime_网址_国外

    https://www.douban.com/group/topic/6248314/ 国外威客网站大全 国外兼职网站,以及国外外包网站.这些国外项目网站包括的项目类型很多:logo设计.图形设计.f ...

  3. 转 GTID复制的搭建和问题处理

    ########sample 1: 了解mysqldump 和 mysqlbackup  和 gtid_executed 和 gtid_purged https://www.linuxidc.com/ ...

  4. HDU 5773 The All-purpose Zero 脑洞LIS

    给定一个序列,里面的0是可以任变的.问变化后最长的LIS的长度 首先,0全部选上是不亏的.这个不知道怎么说,YY一下吧. 最关键的就是解决2 0 0 3 这种问题了. 注意到这个序列的LIS应该是3 ...

  5. C# 用正则表达式判断字符串是否为纯数字

    Regex regex = new System.Text.RegularExpressions.Regex("^(-?[0-9]*[.]*[0-9]{0,3})$"); stri ...

  6. 机器学习框架ML.NET学习笔记【2】入门之二元分类

    一.准备样本 接上一篇文章提到的问题:根据一个人的身高.体重来判断一个人的身材是否很好.但我手上没有样本数据,只能伪造一批数据了,伪造的数据比较标准,用来学习还是蛮合适的. 下面是我用来伪造数据的代码 ...

  7. C#与重构(入门)

    C#与代码重构(入门) 重构(Refactoring)就是通过调整程序代码改善软件的质量.性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性. 单从概念少来理解重构可能很抽象,那么通过下 ...

  8. OC与JS交互前言

    OC与JS交互过程中,可能会需要使用本地image资源及html,css,js文件,这些资源应该如何被加载? 一.WebView加载HTML UIWebView提供了三个方法来加载html资源 1.  ...

  9. js 数组操作常用方法

    push():在数组后面加入元素,并返回数组的长度: unshift():在数组前面就如元素,并返回数组的长度: pop():删除最后一个元素: var arr =[1,2,3,4,5] ; arr. ...

  10. SpringBoot JUnit4的断言和注解

    Junit4的断言常用方法: assertArrayEquals( new Object[]{ studentService.likeName("小明2").size() > ...