大数高精运算-----乘法
时间:2010-06-23 来源:chzhdefn
高精乘法
-----------------------------------------------------------------------
先写个两个数的乘积 有空改成个多个数的积
-----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int i, j, k;
char a1[50], a2[50];
int s1[50], s2[50];
int s[100];
void mul(int *s1, int *s2, int *s) {
for (i=0; i<strlen(a1); i++)
for (j=0; j<strlen(a2); j++)
s[i+j]+=s1[i]*s2[j];
int k=100;
while (!s[k])
--k;
for (i=0,j=0; i<=k; i++) {
s[i+1]+=s[i]/10;
s[i]%=10;
}
}
int main() {
gets(a1);
gets(a2); int m=strlen(a1)+strlen(a2);
for (i=strlen(a1)-1; i>=0; --i)
s1[i]=(a1[strlen(a1)-i-1]-'0');
for (i=strlen(a2)-1; i>=0; --i)
s2[i]=(a2[strlen(a2)-i-1]-'0');
for (i=0; i<100; i++)
s[i]=0;
mul(s1, s2, s);
for (i=m-1; i>=0; --i)//
printf("%d", s[i]); system("pause");
}
---------------------------------------------
1010101010101010101
1010101010101010101
输出1020304050607080910090807060504030201
----------------------------------------------
-----------------------------------------------
输入任意整数!!!!!!!!!辛苦修改 !!!!!!
#include <stdio.h>
#include <stdlib.h>
int i, j, k;
char a1[100], a2[100];
int s1[1000], s2[100];
int s[1000];
int temp=1;
int main() {
gets(a1);
for (i=strlen(a1)-1; i>=0; --i)
s1[i]=(a1[strlen(a1)-i-1]-'0');
//上面的 是取得s1 然后转为int 数组
int m=strlen(a1);//提前算出a1 长度
while (gets(a2), strcmp(a2, "~")) { //遇到~结束
for (i=strlen(a2)-1; i>=0; --i)
s2[i]=(a2[strlen(a2)-i-1]-'0');
for (i=0; i<100; i++)
s[i]=0;///s 初始化 开始计算了
for (i=0; i<m; i++)
for (j=0; j<strlen(a2); j++)
s[i+j]+=s1[i]*s2[j];//开始计算了 结果保存到 s中
int k=1000;
while (!s[k])
--k;
// 算出s中的有效位数
m=m+strlen(a2);
for (i=0; i<=k; i++) {
s[i+1]+=s[i]/10;
s[i]%=10;
}
for (i=0; i<m; ++i)
s1[i]=s[i];
// temp++; 两个数乘前面多两个个零 三个数乘后面多三个零 不知道为什么 只能放个temp在这里 使后面少输出temp位
}
for (i=m; i>=0; --i) //这里改成i=m-temp 就可以少输出前面的temp位 但是发现最前面如果要进位的话就会被去掉了 无奈。。。。。
printf("%d", s1[i]);
}
改起来麻烦 所以就没用函数 有点美中不足 前面的零不好去掉!。。。 输入两个数前面两个零 输入三个数 前面多三个零
--------------------------------------------------------------------
999999999999999
999999999999999
999999999999999
999999999999999
~
输出 0999999999999996000000000000005999999999999996000000000000001
-------------------------------------------------------------------------------------------终于完了 虽然写的很丑~~~~~~~
总结 :方法类似于加法 除了这里 s[i+j]+=s1[i]*s2[j] ;
注意格式的控制 这里得开两个数组
-----------------------------------------------------------------------
先写个两个数的乘积 有空改成个多个数的积
-----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int i, j, k;
char a1[50], a2[50];
int s1[50], s2[50];
int s[100];
void mul(int *s1, int *s2, int *s) {
for (i=0; i<strlen(a1); i++)
for (j=0; j<strlen(a2); j++)
s[i+j]+=s1[i]*s2[j];
int k=100;
while (!s[k])
--k;
for (i=0,j=0; i<=k; i++) {
s[i+1]+=s[i]/10;
s[i]%=10;
}
}
int main() {
gets(a1);
gets(a2); int m=strlen(a1)+strlen(a2);
for (i=strlen(a1)-1; i>=0; --i)
s1[i]=(a1[strlen(a1)-i-1]-'0');
for (i=strlen(a2)-1; i>=0; --i)
s2[i]=(a2[strlen(a2)-i-1]-'0');
for (i=0; i<100; i++)
s[i]=0;
mul(s1, s2, s);
for (i=m-1; i>=0; --i)//
printf("%d", s[i]); system("pause");
}
---------------------------------------------
1010101010101010101
1010101010101010101
输出1020304050607080910090807060504030201
----------------------------------------------
-----------------------------------------------
输入任意整数!!!!!!!!!辛苦修改 !!!!!!
#include <stdio.h>
#include <stdlib.h>
int i, j, k;
char a1[100], a2[100];
int s1[1000], s2[100];
int s[1000];
int temp=1;
int main() {
gets(a1);
for (i=strlen(a1)-1; i>=0; --i)
s1[i]=(a1[strlen(a1)-i-1]-'0');
//上面的 是取得s1 然后转为int 数组
int m=strlen(a1);//提前算出a1 长度
while (gets(a2), strcmp(a2, "~")) { //遇到~结束
for (i=strlen(a2)-1; i>=0; --i)
s2[i]=(a2[strlen(a2)-i-1]-'0');
for (i=0; i<100; i++)
s[i]=0;///s 初始化 开始计算了
for (i=0; i<m; i++)
for (j=0; j<strlen(a2); j++)
s[i+j]+=s1[i]*s2[j];//开始计算了 结果保存到 s中
int k=1000;
while (!s[k])
--k;
// 算出s中的有效位数
m=m+strlen(a2);
for (i=0; i<=k; i++) {
s[i+1]+=s[i]/10;
s[i]%=10;
}
for (i=0; i<m; ++i)
s1[i]=s[i];
// temp++; 两个数乘前面多两个个零 三个数乘后面多三个零 不知道为什么 只能放个temp在这里 使后面少输出temp位
}
for (i=m; i>=0; --i) //这里改成i=m-temp 就可以少输出前面的temp位 但是发现最前面如果要进位的话就会被去掉了 无奈。。。。。
printf("%d", s1[i]);
}
改起来麻烦 所以就没用函数 有点美中不足 前面的零不好去掉!。。。 输入两个数前面两个零 输入三个数 前面多三个零
--------------------------------------------------------------------
999999999999999
999999999999999
999999999999999
999999999999999
~
输出 0999999999999996000000000000005999999999999996000000000000001
-------------------------------------------------------------------------------------------终于完了 虽然写的很丑~~~~~~~
总结 :方法类似于加法 除了这里 s[i+j]+=s1[i]*s2[j] ;
注意格式的控制 这里得开两个数组
相关阅读 更多 +