C语言超长整数乘法计算问题
加法:
voidAdd(char s1[],char s2[])//参数为两个字符串数组{ int num1[M],num2[M]; int i,j; len1 = strlen (s1); len2 = strlen (s2); for (i = len1-1,j = 0; i >= 0; i--)//num1[0]保存的是低位 num1[j++]= s1[i] - '0'; for (i = len2-1,j = 0; i >= 0; i --) num2[j++] = s2[i] - '0'; for (i = 0; i 9) { num1[i] -= 10; num1[i+1] ++; } } for(i = M-1; (i >= 0)&&(num1[i] == 0); i --) ;//找到第一个不是 0的数的位置 if (i>= 0) //从高位到低位输出每个数 for(; i >= 0; i --) printf ("%d",num1[i]); else printf ("0
");}减法等于加上负的数
乘法
voidMulti(char str1[],char str2[]){ int len1,len2,i,j; int a[MAX+10],b[MAX+10],c[MAX*2+10]; memset (a,0,sizeof(a)); memset (b,0,sizeof(b)); memset (c,0,sizeof(c)); len1=strlen(str1); for(j=0,i=len1-1; i>=0; i--)//把数字倒过来 a[j++]=str1[i]-'0'; len2=strlen(str2); for(j=0,i=len2-1; i>=0; i--)//倒转第二个整数 b[j++]=str2[i]-'0'; for(i=0; i=10) { c[i+1]+=c[i]/10; c[i]%=10; } for(i=MAX*2; (c[i]==0)&&(i>=0);i--);//跳过高位的0 if(i>=0) for(; i>=0; i--) printf("%d", c[i]); else printf("0"); pritnf("
");} 除法最难 看这里吧http://wenku.baidu.com/link?url=rvqp3ApH2ujxsqTnoEnUmxc-hcvZz0Z8aV2NbvdxKOjBwRqx60Gju0ll56kccdo7u2_Kw8J1BGMlQpYmBhg4nT4lp7xt7mGtqaPV7x4CI-y(你们竟然会布置除法! 一般都是到乘法)
该程序是你想要的,修改后可以实现任意位数的乘法运算
#include "Stdio.h"
int main(void)
{
int a[9]={9,9,9,9,9,9,9,9,9},b[9]={9,9,9,9,9,9,9,9,9},c[18],d[18];
int i,j,N1,N2,N,temp,n,sum,e;
N1=9;
N2=9;
N=N1+N2;
for(i=0;i<18;i++){c[i]=0;d[i]=0;}
for(i=0;i<N2;i++)
{
n=N-i-1;
for(j=0;j<N1;j++)
{
temp=a[N1-j-1]*b[N2-i-1];
c[n]=c[n]+temp % 10;
c[n-1]=c[n-1]+temp /10;
n=n-1;
}
}
for(i=0;i<N;i++)
{
c[N-i-2]=c[N-i-2]+c[N-i-1]/10;
c[N-i-1]=c[N-i-1] % 10;
}
for(i=0;i<N1;i++)printf("%d ",a[i]);
printf(" x ");
for(i=0;i<N2;i++)printf("%d ",b[i]);
printf("
");
printf("= ");
for(i=0;i<N;i++)printf("%d ",c[i]);
printf("
");
printf("
");
printf("
");
getch();
sum=0;
for (i=1;i<=9;i++ ) sum=sum+i;
for(i=0;i<N;i++)printf("%d ",c[i]);
printf("/ %d
",sum);
getch();
for (i=0;i<N-1;i++)
{
d[i]=c[i]/sum;
c[i+1]=(c[i] % sum)*10+c[i+1];
c[i]=0;
}
d[N-1]=c[N-1] /sum;
e=c[N-1] % sum;
printf("=");
for(i=0;i<N;i++)printf("%d ",d[i]);
printf("yushu %d ",e);
printf("
");
getch();
}
c[i+j] = a[i] * b[j] + c[i+j];
c[i+j+1] = c[i+j] / 10 + c[i+j+1];
c[i+j] = c[i+j] % 10;
应该是关于进位的,大于10 就要向前进一位
c[i+j] = a[i] * b[j] + c[i+j]; 比如这个等于 36 那么 把6 留下 3 进到 前一位去 ;
c[i+j+1] = c[i+j] / 10 + c[i+j+1]; 这句是向前进 十位 的 ;
c[i+j] = c[i+j] % 10; 这句就是 留下 各位 ;
这个不是跟乘法的思想是一样的嘛 每一位都要相乘嘛!
就行 55 * 55
不是需要 乘 4 遍嘛!
两层循环就是依次用一个数组的每一位依次去乘另外一个数组的每一位,然后把乘的结果写到结果的相应位,超过10的要写到上一位
C语言超长整数乘法计算问题
c[i+j] = c[i+j] % 10; 这句就是 留下 各位 ;这个不是跟乘法的思想是一样的嘛 每一位都要相乘嘛!就行 55 * 55 不是需要 乘 4 遍嘛!
C语言编程,求用分治法实现大整数乘法
144 ---(5)这样就转行为计算(3)(4)等要是多位数,那么(3)(4)会很多,计算这些的和就是了 最终的到的(5)就是结果 那么这个问题也是两个子函数,一个是大数的加法,就是计算(3)(4)等的和 一个是(1)和(2)的每位数的乘法 ...
怎么用数组完成两个超长的正整数乘法
\/\/此程序实现了两个大整数的乘法,注:整数用二进制表示。即每一位都是0或1表示 \/\/例如:100011 1011101\/\/程序中先输入被乘数和乘数的位数,然后动态申请空间,以字符的形式来处理长整数的每一位。\/\/模拟计算机乘法的实现,将整数乘法转换为整数加法来实现。#include <stdio.h>\/\/将数组元素左移x位...
c语言大整数乘法
include<string.h> void chengfa(char *a,char*b){ char c[10000];int fuhao1,fuhao2;if(a[0] == '-' || a[0] == '+') { if(a[0] == '-')fuhao1 = -1;else fuhao1 = 1;strcpy(c,a+1);strcpy(a,c);} if(b[0] == '-' || b[0] == '+') { if(b[...
c语言 大整数乘法
int i,j,k=0;char a[201]="0",b[201]="0",c[401]="0"; \/\/这里将c[0]设为‘0’,影响到下面输入 scanf("%s%s",a,b);for (i=0;i<=strlen(a)-1;i++)for (j=0;j<=strlen(b)-1;j++){c[i+j+1]+=(a[i]-'0')*(b[j]-'0');} k=(strlen(a)+strlen(...
c语言大整数的乘法
nums[]为指针变量数组 nums[i]=j仅能表示将nums[i]存储的地址改为了j 若想修改其值,需加*,即*nums[i]=j;或nums[i]=&j;你的程序里貌似很多地方这个都弄反了,改正后应该就没有问题了...
用c语言编大整数乘法的分析
1,加10是为了防止数据越界 2,根据乘法的特性来的,乘数和被乘数的每一个数字都相乘,乘数的i位和被乘数的j位是结果的第i+j位 3,求两个数相乘的结果有多少位。
C语言大整数相乘
\/*这个函数模拟大整数的左移*\/ void LShift( CHAR* x, int digits ){ UINT i;for ( i = 0; i < digits - 1; i ++ ) { x[i] = x[i+1];} x[digits] = 0;} \/*这个乘法函数计算大整数a与给定的y的乘积,乘积加入c右半部*\/ void OneDigitMultiply( UINT y ){ UINT i;UIN...
c语言大整数乘法,我的程序不知道哪里出错了,可以运行结果有点不对...
大数乘法没必要比较输入的两个数的长度,虽然计算的顺序不同,但是结果一样,多此一举,这是我写的程序,你参考下,你的程序运行前几个数字有的时候是0,注意改下 include <stdio.h>#include <string.h>void multiply(char* a,char* b,char* c) { int i,j,ca,cb,d[10000],*s=d; ...
c语言大整数乘法
\/*功能:乘,用于进制转换之类*\/ \/*参数:a 和 b 分别为乘数,结果保存到 r , d 为使用的进制*\/ \/*注意:r 可以等于 a , b一定要小于d, 如果被乘数有前导0 则结果也会有前导0*\/ \/*返回值:结果的位数*\/ int mulx(char * a,int b,char * r,int d){ int i,j,k,len;int c...