求助: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语言教案
网页URL:http://cqwzjz.cn/article/hsgjoh.html