重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#include stdio.h
创新互联致力于互联网品牌建设与网络营销,包括网站建设、网站制作、SEO优化、网络推广、整站优化营销策划推广、电子商务、移动互联网营销等。创新互联为不同类型的客户提供良好的互联网应用定制及解决方案,创新互联核心团队10年专注互联网开发,积累了丰富的网站经验,为广大企业客户提供一站式企业网站建设服务,在网站建设行业内树立了良好口碑。
#include string.h
#define MAXSIZE 1025
void Div(char *str1, char *str2, char *str3)
{
int i1, i2, i, j, jj, tag, carry, cf, c[MAXSIZE];
int len1 = strlen(str1), len2 = strlen(str2), lend;
char d[MAXSIZE];
memset(c, 0, sizeof(c));
memcpy(d, str1, len2);
lend = len2; j = 0;
for( i1=len2-1; i1 len1; ++i1 )
{
if( lend len2 )
{
d[lend] = str1[i1+1]; c[j] = 0;
++j; ++lend;
}
else
if( lend == len2 )
{
jj = 1;
for( i=0; i lend; ++i )
{
if( d[i] str2[i] ) break;
else if( d[i] str2[i] )
{
jj = 0; break;
}
}
if( jj == 0 )
{
d[lend] = str1[i1+1]; c[j] = 0;
++j; ++lend;
continue;
}
}
if( jj==1 || lend len2 )
{
cf = jj=0;
while( d[jj] = '0' jj lend ) ++jj;
if( lend-jj len2 ) cf = 1;
else
if( lend-jj len2 ) cf = 0;
else
{
i2 = 0; cf = 1;
for( i=jj; i lend; ++i )
{
if( d[i] str2[i2] )
{
cf = 0; break;
}
else if( d[i] str2[i2] )
{
break;
}
++i2;
}
}//else
while( cf )
{
i2 = len2-1; cf = 0;
for( i=lend-1; i = lend-len2; --i )
{
d[i] = d[i]-str2[i2]+'0';
if( d[i] '0' )
{
d[i] = d[i]+10; carry = 1;
--d[i-1];
}
else carry = 0;
--i2;
}
++c[j]; jj=0;
while( d[jj] = '0' jj lend ) ++jj;
if( lend-jj len2 ) cf = 1;
else
if( lend-jj len2 ) cf = 0;
else
{
i2 = 0; cf = 1;
for( i=jj; i lend; ++i )
{
if( d[i] str2[i2] )
{
cf = 0; break;
}
else if( d[i] str2[i2] )
{
break;
}
++i2;
}
}//else
}//while
jj = 0;
while( d[jj] = '0' jj lend ) ++jj;
for( i=0;i lend-jj; ++i ) d[i] = d[i+jj];
d[i] = str1[i1+1]; lend = i+1;
++j;
}//else
}//for
i = tag = 0;
while( c[i] == 0 ) ++i;
for( ; i j; ++i, ++tag ) str3[tag] = c[i]+'0';
str3[tag] = '\0';
}
int main()
{
char a[110], b[110], c[110];
scanf( "%s%s", a, b );
Div( a, b, c );
printf( "%s\n", c );
return 0;
}
//只得到商的整数部分,小数部分没有
#include "stdio.h"
#include "math.h"
void main(void)
{
int a,b,c,d,e,g;
float f;
printf("int a,b");
scanf("%d %d",a,b);
c=a+b;
d=a-b;
e=a*b;
f=a/(float)b ;
g=a%b;
printf("c=%d\n d=%d\n e=%d\n f=%f\n g=%d\n",c,d,e,f,g);
}
整数除整数得到的一定是整数,这个和c语言中的自动类型转换有关,按照我上面写的,把b强制转换成浮点型,这样得到的结果就是浮点型,还有输出浮点型数时用 %f 。
#include stdio.h
#define MAXINT 1000
int compare(int a[],int b[]);
int bigplus(int a[],int b[],int c[]);
int bigsub(int a[],int b[],int c[]);
int bigmult(int a[],unsigned int b,int c[]);
int bigmult2(int a[],int b[],int c[]);
int bigdiv(int a[],unsigned int b,int c[],int *d);
int bigdiv2(int a[],int b[],int c[],int d[]);
int main(int argc, char *argv[])
{
int a[MAXINT]={10,5,4,6,5,4,3,2,1,1,1}; //被乘数或被除数
int b[MAXINT]={7,7,6,5,4,3,2,1}; //乘数或除数
int c[MAXINT],d[MAXINT]; //c[]存放商,d[]存放余数
int div=1234; //小乘数或小除数
int k=0;
int *res=k; //小余数整数指针
bigplus(a,b,c);
bigsub(a,b,c);
bigmult(a,div,c);
bigmult2(a,b,c);
bigdiv(a,div,c,res);
bigdiv2(a,b,c,d);
getchar();
return 0;
}
int compare(int a[],int b[]) //比较大整数的大小
{
int i;
if (a[0]b[0]) return 1; //比较a,b的位数确定返回值
else if (a[0]b[0]) return -1;
else //位数相等时的比较
{
i=a[0];
while (a[i]==b[i]) //逐位比较
i--;
if (i==0) return 0;
else if (a[i]b[i]) return 1;
else return -1;
}
}
int bigplus(int a[],int b[],int c[]) //大整数加法
{
int i,len;
len=(a[0]b[0]?a[0]:b[0]); //a[0] b[0]保存数组长度,len为较长的一个
for(i=0;iMAXINT;i++) //将数组清0
c[i]=0;
for (i=1;i=len;i++) //计算每一位的值
{
c[i]+=(a[i]+b[i]);
if (c[i]=10)
{
c[i]-=10; //大于10的取个位
c[i+1]++; //高位加1
}
}
if (c[i+1]0) len++;
c[0]=len; //c[0]保存结果数组实际长度
printf("Big integers add: ";
for (i=len;i=1;i--)
printf("%d",c[i]); //打印结果
printf("\n";
return 0;
}
int bigsub(int a[],int b[],int c[]) //大整数减法
{
int i,len;
len=(a[0]b[0]?a[0]:b[0]); //a[0]保存数字长度,len为较长的一个
for(i=0;iMAXINT;i++) //将数组清0
c[i]=0;
if (compare(a,b)==0) //比较a,b大小
{
printf("Result:0";
return 0;
}
else if (compare(a,b)0)
for (i=1;i=len;i++) //计算每一位的值
{
c[i]+=(a[i]-b[i]);
if (c[i]0)
{
c[i]+=10; //小于0的原位加10
c[i+1]--; //高位减1
}
}
else
for (i=1;i=len;i++) //计算每一位的值
{
c[i]+=(b[i]-a[i]);
if (c[i]0)
{
c[i]+=10; //小于0原位加10
c[i+1]--; //高位减1
}
}
while (len1 c[len]==0) //去掉高位的0
len--;
c[0]=len;
printf("Big integers sub= ";
if (a[0]b[0]) printf("-";
for(i=len;i=1;i--) //打印结果
printf("%d",c[i]);
printf("\n";
return 0;
}
int bigmult(int a[],unsigned int b,int c[])//高精度乘以低精度
{
int len,i;
for (i=0;iMAXINT;i++) //数组清0
c[i]=0;
len=a[0];
for(i=1;i=len;i++) //对每一位计算
{
c[i]+=a[i]*b;
c[i+1]+=c[i]/10;
c[i]%=10;
}
while (c[++len]=10) //处理高位
{
c[len+1]=c[len]/10;
c[len]%=10;
}
if (c[len]==0) len--; //处理高进位为0情况
printf("Big integrs multi small integer: ";
for (i=len;i=1;i--)
printf("%d",c[i]);
printf("\n";
}
int bigmult2(int a[],int b[],int c[]) //高精度乘以高精度
{
int i,j,len;
for (i=0;iMAXINT;i++) //数组清0
c[i]=0;
for (i=1;i=a[0];i++) //被乘数循环
for (j=1;j=b[0];j++) //乘数循环
{
c[i+j-1]+=a[i]*b[j]; //将每一位计算累加
c[i+j]+=c[i+j-1]/10; //将每一次结果累加到高一位
c[i+j-1]%=10; //计算每一次的个位
}
len=a[0]+b[0]; //取最大长度
while (len1 c[len]==0) //去掉高位0
len--;
c[0]=len;
printf("Big integers multi: ";
for (i=len;i=1;i--) //打印结果
printf("%d",c[i]);
printf("\n";
}
int bigdiv(int a[],unsigned int b,int c[],int *d) //高精度除以低精度
{ //a[] 为被乘数,b为除数,c[]为结果,d为余数
int i,len;
len=a[0]; //len为a[0]的数组长度
for (i=len;i=1;i--)
{
(*d)=10*(*d)+a[i]; //计算每一步余数
c[i]=(*d)/b; //计算每一步结果
(*d)=(*d)%b; //求模余数
}
while (len1 c[len]==0) len--; //去高位0
printf("Big integer div small integer: ";
for (i=len;i=1;i--) //打印结果
printf("%d",c[i]);
printf("\tArithmetic compliment:%d",*d);
printf("\n";
}
int bigdiv2(int a[],int b[],int c[],int d[]) //高精度除以高精度
{
int i,j,len;
if (compare(a,b)0) //被除数较小直接打印结果
{
printf("Result:0";
printf("Arithmetic compliment:";
for (i=a[0];i=1;i--) printf("%d",a[i]);
printf("\n";
return -1;
}
for (i=0;iMAXINT;i++) //商和余数清0
{
c[i]=0;
d[i]=0;
}
len=a[0];d[0]=0;
for (i=len;i=1;i--) //逐位相除
{
for (j=d[0];j=1;j--)
d[j+1]=d[j];
d[1]=a[i]; //高位*10+各位
d[0]++; //数组d长度增1
while (compare(d,b)=0) //比较d,b大小
{
for (j=1;j=d[0];j++) //做减法d-b
{
d[j]-=b[j];
if (d[j]0)
{
d[j]+=10;
d[j+1]--;
}
}
while (j0 d[j]==0) //去掉高位0
j--;
d[0]=j;
c[i]++; //商所在位值加1
}
}
j=b[0];
while (c[j]==0 j0) j--; //求商数组c长度
c[0]=j;
printf("Big integers div result: ";
for (i=c[0];i=1;i--) //打印商
printf("%d",c[i]);
printf("\tArithmetic compliment: "; //打印余数
for (i=d[0];i=1;i--)
printf("%d",d[i]);
printf("\n");
}
1、大数就是位数多,数值大的意思。通常来说c语言里的基本数据类型范围是有限的,如long型的最大只能表示几十亿,几十亿也就11位数字长度而已。如果用100长的数组表示,假设数组一个元素存数字的一位,那么总位数可以达到100位,这是基本数据类型无法表示的。
2、例程:
#include"stdio.h"
int getlength(char a[]){
int i=0;
while(a[i])
i++;
return i;
}/*返回字符串的长度*/
int chartoint(char a){
return a-48;
}/*将字符编程整形*/
void creatarray(char a[],char b[]){
printf("请输入第一个数:");
scanf("%s",a);
printf("请输入第二个数:");
scanf("%s",b);
}/*创建数组*/
void go(char a[],char b[],int s[]){
int alength=getlength(a);
int blength=getlength(b);
int i=alength-1;
int j=blength-1;
int k;/*s数组下标*/
int slength;
if(alengthblength)
slength=alength;
else
slength=blength;
k=slength;
while(i=0j=0)
s[k--]=chartoint(a[i--])+chartoint(b[j--]);
while(i=0)
s[k--]=chartoint(a[i--]);
while(j=0)
s[k--]=chartoint(b[j--]);
k=slength;
while(k=2){
if(s[k]=10){
s[k-1]++;
s[k]-=10;
}
k--;
}
printf("两数之和为:");
if(s[1]=10){
s[0]=1;
s[1]-=10;
for(i=0;i=slength;i++)
printf("%d",s[i]);
}
else{
for(i=1;i=slength;i++)
printf("%d",s[i]);
}
printf("\n");
}
void main(){
char a[1000],b[1000];
int s[1000];
int lab;
lab1: creatarray(a,b);
go(a,b,s);
printf("请输入1继续(想退出按其他数字键):");
scanf("%d",lab);
if(lab==1)
goto lab1;
}