C++大数问题
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++大数问题的更多相关文章
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- c语言经典算法——查找一个整数数组中第二大数
题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...
- 杨氏矩阵:查找x是否在矩阵中,第K大数
参考:http://xudacheng06.blog.163.com/blog/static/4894143320127891610158/ 杨氏矩阵(Young Tableau)是一个很奇妙的数据结 ...
- 蓝桥杯算法提高 P1001(大数乘法)
算法提高 P1001 时间限制:1.0s 内存限制:256.0MB 当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体 ...
- 51nod 1005 大数加法
#include<iostream> #include<string> using namespace std; #define MAXN 10001 },b[MAXN]={} ...
- PHP大数(浮点数)取余
一般我们进行取余运算第一个想到的就是用百分号%,但当除数是个很大的数值,超出了int范围时,这样取余就不准确了. php大数(浮点数)取余函数 /** * php大数取余 * * @param int ...
- HDU 5686 斐波那契数列、Java求大数
原题:http://acm.hdu.edu.cn/showproblem.php?pid=5686 当我们要求f[n]时,可以考虑为前n-1个1的情况有加了一个1. 此时有两种情况:当不适用第n个1进 ...
- 区间K 大数查询
算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列 ...
- HDU 5047 Sawtooth(大数优化+递推公式)
http://acm.hdu.edu.cn/showproblem.php?pid=5047 题目大意: 给n条样子像“m”的折线,求它们能把二维平面分成的面最多是多少. 解题思路: 我们发现直线1条 ...
随机推荐
- GUI的最终选择 Tkinter(五):Text用法
Text组件 绘制单行文本使用Label组件,多行选使用Listbox,输入框使用Entry,按钮使用Button组件,还有Radiobutton和Checkbutton组件用于提供单选或多选的情况, ...
- python_魔法方法(三):__str__()和__repr__()
使用python的魔法方法和time模块定制一个计时器的类 1.用time模块里的localtime()方法获取时间2.time.localtime返回struct_time格式3.表现你的类:__s ...
- Win7 桌面图标消失
win7 桌面图标消失或任务栏也消失,可以按Ctrl+Shift+Esc键调出任务管理器,然后点击文件——新建任务,输入explorer.
- Seven-segment Display 贪心选择,快速判断能否有解
https://csacademy.com/contest/round-39/task/seven-segment-display/ 可以知道,只有1是无解 而且肯定是选出来的位数约小越好. 位数 = ...
- Java匹马行天下之JavaWeb核心技术——JSP
JSP动态网页技术 一.JavaWeb简介 一.什么是JavaWeb? JavaWeb是用Java技术来解决相关web互联网领域的技术总称. 需要在特定的web服务器上运行,分为web服务器和web客 ...
- CSS细节
写起这篇文章,是因为阅读张鑫旭到的一篇文章<CSS的学习瓶颈>,里面提到了要重视CSS的细节和实现机制.确实:有必要掌握一些关于CSS方面的细节,而不是遇到任何页面,都添加css.rese ...
- phpcms如何调用某一组图里的所有图片
{pc:get sql="select * from v9_picture_data where id = '$id'"} {loop $data $n $r} {loop str ...
- form中onsubmit的使用
form 中的onsubmit在点submit按钮时被触发,如果return false;则结果不会被提交到action中去(也就是提交动作不会发生),如果不返回或者返回true,则执行提交动作.(& ...
- IOS NSTimer 定时器用法总结
NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一.初始化方法:有五种初始化方法,分别是 + (NSTimer *)ti ...
- POJ3233Matrix Power Series(矩阵快速幂)
题意 题目链接 给出$n \times n$的矩阵$A$,求$\sum_{i = 1}^k A^i $,每个元素对$m$取模 Sol 考虑直接分治 当$k$为奇数时 $\sum_{i = 1}^k A ...