大数运算模板(C语言)
发布时间:2020-12-14 01:41:08 所属栏目:大数据 来源:网络整理
导读:代码说明: //大数相加 #include stdio.h #include string.h #define MAXN 100 int an1[MAXN+ 10 ]; int an2[MAXN+ 10 ]; char str1[MAXN+ 10 ]; char str2[MAXN+ 10 ]; int main(){ memset (an1, 0 , sizeof (an1)); int i,j; scanf ( "%s" ,str1); j= 0 ;
代码说明: //大数相加
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN+10];
int an2[MAXN+10];
char str1[MAXN+10];
char str2[MAXN+10];
int main()
{
memset(an1,0,sizeof(an1));
int i,j;
scanf("%s",str1);
j=0;
int len1=strlen(str1);
for(i=len1-1;i>=0;i--)
an1[j++]=str1[i]-'0';
while(~scanf("%s",str2)&&str2[0]!='0')
{
memset(an2,sizeof(an2));
j=0;
int len2=strlen(str2);
for(i=len2-1;i>=0;i--)
an2[j++]=str2[i]-'0';
//下面是主要运算过程
for(i=0;i<MAXN;i++){
an1[i]+=an2[i];
if(an1[i]>=10){
an1[i]-=10;
an1[i+1]++;
}
}
//输出
int pan_0 = 0;
for(i=MAXN;i>=0;i--){
if(pan_0)
printf("%d",an1[i]);
else if(an1[i]){
printf("%d",an1[i]);
pan_0 = 1;
}
}
printf("n");
}
return 0;
}
//大数相减
//改动主要运算过程
for(i=0;i<MAXN;i++){
an1[i]-=an2[i];
if(an1[i]<0){
an1[i]+=10;
an1[i+1]--;
}
}
//大数相乘
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN*2+10];
int an2[MAXN+10];
int aresult[MAXN*2+10];
char str1[MAXN+10];
char str2[MAXN+10];
int main()
{
memset(an1,str1);
j=0;
int len1=strlen(str1);
for(i=len1-1;i>=0;i--)
an1[j++]=str1[i]-'0';
int duandian;
duandian=len1-1;
while(~scanf("%s",str2)&&str2[0]!='0')
{
memset(aresult,sizeof(aresult));
memset(an2,sizeof(an2));
j=0;
int len2=strlen(str2);
for(i=len2-1;i>=0;i--)
an2[j++]=str2[i]-'0';
//下面是主要运算过程
for(i=0;i<duandian+1;i++)
for(j=0;j<len2;j++)
aresult[i+j]+=an1[i]*an2[j];
for(i=0;i<MAXN;i++){
if(aresult[i]>=10){
aresult[i+1]+=aresult[i]/10;
aresult[i]%=10;
}
}
//输出
memset(an1,sizeof(an1));
int pan_0 = 0;
for(i=MAXN*2;i>=0;i--){
if(pan_0){
printf("%d",aresult[i]);
an1[i]=aresult[i];
}
else if(aresult[i]){
printf("%d",aresult[i]);
duandian=i;
an1[i]=aresult[i];
pan_0 = 1;
}
}
printf("n");
memset(str2,sizeof(str2));
}
return 0;
}
//大数相除,两个数
//反复做减法,能减几个,商就是几。
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN+10]; //被除数
int an2[MAXN+10]; //除数
int aresult[MAXN+10]; //商
char str1[MAXN+10];
char str2[MAXN+10];
//substract函数表示an1减去an2,返回结果的长度;不够返回-1;刚好返回0;
int subtract(int *p1,int *p2,int len1,int len2)
{
int i;
//判断p1是否比p2大,不是返回-1
if(len1<len2)
return -1;
int pan = 0;
if(len1==len2){
for(i=len1-1;i>=0;i--){
if(p1[i]>p2[i])
pan = 1;
else if(p1[i]<p2[i]){
if(!pan)
return -1;
}
}
}
//p1不小于p2,做减法
for(i=0;i<len1;i++){
p1[i]-=p2[i];
if(p1[i]<0){
p1[i]+=10;
p1[i+1]--;
}
}
for(i=len1-1;i>=0;i--)
if(p1[i])
return i+1;
//一样大
return 0;
}
int main()
{
int t;
scanf("%s",str1);
scanf("%s",str2);
int i,j;
memset(an1,sizeof(an1));
memset(an2,sizeof(an2));
memset(aresult,sizeof(aresult));
j=0;
int len1=strlen(str1);
for(i=len1-1;i>=0;i--)
an1[j++]=str1[i]-'0';
j=0;
int len2=strlen(str2);
for(i=len2-1;i>=0;i--)
an2[j++]=str2[i]-'0';
//运用substract函数
len1=subtract(an1,an2,len1,len2);
//情况1
if(len1<0){
printf("0n");
}
//情况2
else if(len1==0){
printf("1n");
}
//情况3
else
{
aresult[0]++; //已经减了一次,商加1
int times=len1-len2;
if(times<0) //不能再减
goto output;
else if(times>0){
for(i=len1-1;i>=0;i--){
if(i>=times)
an2[i]=an2[i-times];
else
an2[i]=0;
}
}
//!!!
len2=len1;
for(j=0;j<=times;j++){
int tmp;
while((tmp=subtract(an1,an2+j,len2-j))>=0){
len1=tmp;
aresult[times-j]++;
}
}
output:
//进位
for(i=0;i<MAXN;i++){
if(aresult[i]>=10){
aresult[i+1]+=aresult[i]/10;
aresult[i]%=10;
}
}
//输出
int pan_0 = 0;
for(i=MAXN;i>=0;i--){
if(pan_0){
printf("%d",aresult[i]);
}
else if(aresult[i]){
printf("%d",aresult[i]);
pan_0 = 1;
}
}
printf("n");
}
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- DevExpress VCL 12.2.6发布 支持Delphi XE4和C++
- MBMD(MobileNet-based tracking by detection a
- 从与Spring同时加载的非Spring组件访问Spring上下
- desktop-application – 如何在innosetup脚本中查
- Delphi 与 DirectX 之 DelphiX(20): TDirectDraw
- 一键执行更新密文密码到指定目录下的所有文件, 附
- 一个日志挖掘流系统
- 寻找Delphi的径向弹出菜单组件
- delphi – 泛型,多态,接口:解决方案是什么?
- vb.net – 准确的Windows计时器? System.Timers
热点阅读