网站建设资讯

NEWS

网站建设资讯

大整数加法go语言,大整数加法go语言教案

求助:C语言,大整数的加法。可达10^10,000,000位数的。。。

简单的两数相加肯定不行,必须用字符串。下面是我上学的时候编的,不知道能不能用,你看看。

成都创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站制作、成都网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的城区网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

#include

"stdafx.h"

#include

"stdio.h"

#include

"string.h"

#include

"windows.h"

#include

conio.h

//检查合法性

int

check(char

*a)

{

for(int

i=0;istrlen(a);i++)

if(a[i]-'0'0||a[i]-'0'9)

return

0;

return

1;

}

//格式化字符串

void

format(char

*a,char

*b)

{

int

i;

int

maxlen=0,minlen=0,lena=0,lenb=0;

maxlen=strlen(a)strlen(b)?strlen(a):strlen(b);

minlen=strlen(a)strlen(b)?strlen(a):strlen(b);

lena=strlen(a);

lenb=strlen(b);

for(i=lena-1;i=0;i--)

{

a[i+maxlen-lena+1]='0';

//初始化

a[i+maxlen-lena+1]=a[i];

}

for(i=0;i=maxlen-lena;i++)

a[i]='0';

a[maxlen+1]='\0';

for(i=lenb-1;i=0;i--)

{

b[i+maxlen-lenb+1]='0';

//初始化

b[i+maxlen-lenb+1]=b[i];

}

for(i=0;i=maxlen-lenb;i++)

b[i]='0';

b[maxlen+1]='\0';

}

//加法

void

add(char

*a,char

*b)

{

int

c=0;

int

d=0;

int

pw=0;

int

i=0;

int

len=0;

format(a,b);

len=strlen(a);

char

buffer[255]={"0"};

for(i=len-1;i=0;i--)

{

c=a[i]-'0'+b[i]-'0';

d=c%10;

pw=c/10;

a[i-1]=a[i-1]+pw;

buffer[i]=d+'0';

}

buffer[len]='\0';

if(buffer[0]=='0')

printf("%s\n",buffer+1);

else

printf("%s\n",buffer);

}

//减法

void

sub(char

*a,char

*b)

{

int

i=0;

int

abigger=0;

int

bbigger=0;

format(a,b);

for(i=0;istrlen(a);i++)

{

if(a[i]b[i])

{

abigger=1;break;}

else

if(a[i]b[i])

{

bbigger=1;break;}

}

if(i==strlen(a))

{

printf("0");

return;

}

}

//主函数

int

main(int

argc,

char*

argv[])

{

char

num1[256],num2[256];

char

select;

loop:

printf("请输入数字:\n");

gets(num2);

gets(num1);

if(check(num1)==0||check(num2)==0)

{

printf("非法数字!!请检查输入!!!\n");

return

0;

}

printf("请选择运算:1:加法

2:减法

3:乘法

4:除法\n");

select=getchar();

switch(select)

{

case

'1':

add(num1,num2);goto

loop;break;

case

'2':

sub(num1,num2);goto

loop;break;

}

}

课程设计:大整数的加、减和乘运算

#includestdio.h

#includestring.h

#includestdlib.h

#includetime.h

#define Max 1000000

void BigNumsAdd(char *numa,char *numb);

void BigNumsSub(char *numa,char *numb);

void BigNumsMul(char *numa,char *numb);

int check(char *s);

clock_t start,end;

void inscanf(char c,char *n1,char *n2){

char t;

int i=0;

while(1){

t=getchar();

if(t==c !(c=='-'i==0)) break;

n1[i++]=t;

}

n1[i]=0;

i=0;

while(1){

t=getchar();

if(t==10) break;

n2[i++]=t;

}

n2[i]=0;

putchar('=');

}

void switcher(char *n,int *num,int weishu) //将字符数组转换为整形数组

{ //整形数组的低位至高位分别

int i; //储存数据的个位到高位数字

for(i=0;iMax+1;i++) num[i]=0;

for(i=1;iweishu;i++)

num[i]=n[weishu-i]-'0';

if(n[0]=='+' || n[0]=='-')

{

weishu--;

num[0]=n[0];

}

else num[weishu]=n[0]-'0';

}

void BigNumsAdd(char *numa,char *numb) //大整数的相加,其中两个参数分别为两个待输入的字符串

{

int *Num1=NULL,*Num2=NULL,*answer=NULL;

int weishu1,weishu2,wei;

int i,s=0;

if(numa[0]=='-' numb[0]!='-') //两个数一正一负的时候,改变符号后转跳到相减

{

numa[0]='+';

BigNumsSub(numb,numa);

return;

}

if(numb[0]=='-' numa[0]!='-')

{

numb[0]='+';

BigNumsSub(numa,numb);

return;

}

weishu1=strlen(numa);

Num1=(int*)malloc((Max+1)*sizeof(int));

weishu2=strlen(numb);

Num2=(int*)malloc((Max+1)*sizeof(int));

switcher(numa,Num1,weishu1);

switcher(numb,Num2,weishu2);

wei=(weishu1weishu2)?weishu1:weishu2;

answer=(int*)malloc((wei+2)*sizeof(int)); //(wei+2)??防止相加后位数增1

for(i=0;iwei+2;i++) answer[i]=0;

for(i=1;i=wei;i++)

{

answer[i]+=(Num1[i]+Num2[i]);

if(answer[i]=10) //逢十进一

{

answer[i]-=10;

answer[i+1]++;

}

}

if(numa[0]=='-' || numb[0]=='-') //注意负数的时候

printf("-");

if(answer[wei+1]!=0)

printf("%d",answer[wei+1]);

for(i=wei;i=1;i--)

{

if(s==1)

printf("%d",answer[i]);

else if(answer[i]!=0)

{

s=1;

printf("%d",answer[i]);

}

}

if(s==0) printf("\r0");

printf("\n");

free(Num1);

free(Num2);

free(answer);

}

void BigNumsSub(char *numa,char *numb) //大整数的相减(numa-numb)

{

int *Num1=NULL,*Num2=NULL,*answer=NULL;

int weishu1,weishu2,wei,len,j=0;

int i,sign=0,s=0; //负数情况比正数稍麻烦,于是用sign作为答案的正负符号标志

if(numa[0]=='-' numb[0]!='-') //两个数一正一负的时候,稍作调整后转跳到相加

{

len=strlen(numb);

numb[len+1]='\0';

for(j=0;jlen;j++){

numb[j+1]=numb[j];

}

numb[0]='-';

BigNumsAdd(numa,numb);

return;

}

if(numb[0]=='-' numa[0]!='-')

{

numb[0]='+';

BigNumsAdd(numa,numb);

return;

}

weishu1=strlen(numa);

Num1=(int*)malloc((Max+1)*sizeof(int));

weishu2=strlen(numb);

Num2=(int*)malloc((Max+1)*sizeof(int));

switcher(numa,Num1,weishu1);

switcher(numb,Num2,weishu2);

wei=(weishu1weishu2)?weishu1:weishu2;

answer=(int*)malloc((wei+2)*sizeof(int));

for(i=0;iwei+2;i++) answer[i]=0;

for(i=1;i=wei;i++)

{

answer[i]+=(Num1[i]-Num2[i]);

if(answer[i]0) //借位

{

answer[i]+=10;

answer[i+1]--;

}

}

if(answer[wei+1]0)

{

for(i=1;i=weishu2;i++) Num1[i]=0;

for(i=1;i=weishu2;i++)

{

answer[i]=Num1[i]-answer[i];

if(answer[i]0)

{

answer[i]+=10;

answer[i+1]++;

}

}

answer[weishu2+1]=0;

sign++;

}

if(numa[0]=='-') sign++; //注意负数的时候

if(sign%2!=0)

printf("-");

for(i=wei;i=1;i--)

{

if(s==1)

printf("%d",answer[i]);

else if(answer[i]!=0)

{

s=1;

printf("%d",answer[i]);

}

}

if(s==0) printf("\r0");

printf("\n");

free(Num1);

free(Num2);

free(answer);

}

void BigNumsMul(char *numa,char *numb) //大整数乘法

{

int *Num1=NULL,*Num2=NULL,*answer=NULL;

int weishu1,weishu2,wei;

int i,j;

int yu,s=0;

weishu1=strlen(numa);

Num1=(int*)malloc((Max+1)*sizeof(int));

weishu2=strlen(numb);

Num2=(int*)malloc((Max+1)*sizeof(int));

switcher(numa,Num1,weishu1);

switcher(numb,Num2,weishu2);

wei=weishu1+weishu2; //乘法结果的最大位数是两者位数和

answer=(int*)malloc((wei+1)*sizeof(int));

for(i=0;iwei+1;i++) answer[i]=0;

for(j=1;j=weishu1;j++)

{

for(i=1;i=weishu2;i++)

{

answer[j+i-1]+=(Num1[j]*Num2[i]);

if((yu=answer[i+j-1]/10)!=0)

{

answer[i+j]+=yu;

answer[i+j-1]-=yu*10;

}

}

}

if((numa[0]=='-' numb[0]!='-') || (numa[0]!='-' numb[0]=='-'))

printf("-");

for(i=wei;i=1;i--)

{

if(s==1)

printf("%d",answer[i]);

else if(answer[i]!=0)

{

s=1;

printf("%d",answer[i]);

}

}

if(s==0) printf("\r0");

printf("\n");

free(Num1);

free(Num2);

free(answer);

}

int check(char *s) //字符串检查,当格式错误时候返回1,整个数字为0的时候返回2(用于除法的余数),正常返回0

{

int i;

int l,sign=1;

l=strlen(s);

if(s[0]!='-' s[0]!='+' (s[0]'9' || s[0]'0'))

{

printf("ERROR:输入格式错误!\n");

return 1;

}

if(s[0]='0' s[0]='9') sign=0;

for(i=1;il;i++)

{

if(s[i]!='0') sign=0;

if(s[i]'9' || s[i]'0')

{

printf("ERROR:输入格式错误!\n");

return 1;

}

}

if(sign==1) return 2;

else return 0;

}

int main()

{srand(time(NULL));

char *num1,*num2;

int i;

int tmp;

for(i=0;i33;i++)

printf(" ");

num1=(char*)malloc(Max*sizeof(char));

num2=(char*)malloc(Max*sizeof(char));

while(1)

{

system("cls");

printf("\n");

printf("\t\t\t\t 大整数运算程序\n");

printf("\t\t\t\t\tMenu\n");

printf("\t\t\t**************************************\n");

printf("\t\t\t* *\n");

printf("\t\t\t* 1.大整数的加法 *\n");

printf("\t\t\t* 2.大整数的减法 *\n");

printf("\t\t\t* 3.大整数的乘法 *\n");

printf("\t\t\t* 4.退出 *\n");

printf("\t\t\t* *\n");

printf("\t\t\t**************************************\n");

printf("\n\n\t\t\t 请选择(1-4):");

scanf("%d",i);

while((tmp=fgetc(stdin))!='\n');

switch(i)

{

case 1:

printf("输入加法算式:");

inscanf('+',num1,num2);

if(check(num1)==1 || check(num2)==1)

break;

start=clock();

BigNumsAdd(num1,num2);

end=clock();

printf("时间是%f\n",(double)(end-start)/CLOCKS_PER_SEC/1000);

system("pause");

break;

case 2:

printf("输入减法算式:");

inscanf('-',num1,num2);

if(check(num1)==1 || check(num2)==1)

break;

start=clock();

BigNumsSub(num1,num2);

end=clock();

printf("时间是%f\n",(double)(end-start)/CLOCKS_PER_SEC/1000);

system("pause");

break;

case 3:

printf("输入乘法算式:");

inscanf('*',num1,num2);

if(check(num1)==1 || check(num2)==1)

break;

start=clock();

BigNumsMul(num1,num2);

end=clock();

printf("时间是%f\n",(double)(end-start)/CLOCKS_PER_SEC/1000);

system("pause");

break;

case 4:

free(num1);

free(num2);

return 0;

default:

printf("输入错误!\n");

}

printf("\n");

}

}

大整数加法:求两个不超过200位的非负整数的和。输入两行,每行不超过200位非负整数,可能有多余的零

#include iostream

#include cstring

#include algorithm

using namespace std;

int main()

{

// 初始化和定义标志位

int num1[200] = {0}, num2[200] = {0}, flag = ???;

// flag == 0 表示两数相等,flag == 1 表示 ab,flag == -1 表示 ab 。

char str1[201], str2[201];

// 数据输入

cin str1 str2;

int len1 = strlen(str1);

int len2 = strlen(str2);

// 数据存储

for(int i = 0; i len1; i++) {

num1[i] = str1[len1-i-1] - '0';

}

for(int i = 0; i len2; i++) {

num2[i] = ____??2____;

}

// 数据比较

int i,int,flag = 0;;

if (len1 len2) flag = 1;

// num1 的位数大于 num2 则 num1 比 num2 大

if (len1 len2) flag = -1;

// num1 的位数小于 num2 则 num1 比 num2 小

if (len1 == len2) {

for(i = len1; i ____??3____ 0; i--){ // 从高位到低位比较

if (num1[i] num2[i]) {

flag = 1;

break;

}

if (num1[i] num2[i]) {

flag = -1;

break;

}

}

}

// 输出

cout str1 ;

if (flag == 0)

cout " = ";

else if (flag == 1)

cout " ";

else cout " ";

cout str2;

return 0;

}

大整数的加法

简单喽,这题目我做过减法有点烦,加法简单的不行,怕你不想看代码,我简单说说算法:先创建字符数组,然后把输入的字符-48化成数字倒序变成整形数组,然后按位相加,过10进位(小学算术)!!代码如下(c++):#includeiostream

#includevector

#includecstring

using namespace std;

void fillup(vectorchar,vectorchar,int,int);

int maxi(int,int);

int count=0;

vectorint na,nb;

void plus(vectorint,vectorint);

void minus(vectorint,vectorint);

int main()

{

vectorchar a,b;

char next='0';

bool flag=false;不好意思,手机上代码太长,发不上来,算法我说了,很简单的,你自己试试吧


当前标题:大整数加法go语言,大整数加法go语言教案
链接分享:http://cdweb.net/article/hsgjoh.html