当前位置:首页 » 编程语言 » c语言高精度乘法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言高精度乘法

发布时间: 2022-05-13 21:35:51

c语言高精度乘法问题

是字符串输入问题,你最好是再定义俩个数组,再将指针变量指向他们,否则没有指向的指针得到的答案就很不一样了,你用tc调吧,我调了一下,不过你这逻辑错误太多,只能你自己试验了。用tc加监视器调试。

② C语言:求n阶乘(高精度) 已经用高精度乘法,如何组合程序,完成功能呢

你的程序有些问题 我改了一下 你看看
#include<stdio.h>#include<string.h>
//将数转为数组
int f(int n,int a[]){
int i=0;
while(n!=0){
a[i++]=n%10;
n=n/10;
}
return i;
}
//求数组长度
int qiu(int a[]){
int i;
for(i=2003;i>=0;i--) {
if(a[i]!=0) {
return i+1;
break;
}
}
return 0;
}

//将数组a 赋值到数组b 并清零数组a
void fu(int a[],int b[]){
int a1,b1,i;
a1=qiu(a);
b1=qiu(b);
for(i=0;i<b1;i++){
b[i]=0;
}
for(i=0;i<a1;i++){
b[i]=a[i];
}
for(i=0;i<a1;i++){
a[i]=0;
}
}

//求n的阶乘
int fun(int n){
int i=0,k;
int a[2004]={0},b[2004]={0} ,c[2004]={0};
if(n==0||n==1){
printf("n=%d的阶乘为:1\n",n);
}
else
{
f(1,a);
f(2,b);
fac(a,b,c);
for(i=3;i<=n;i++){
fu(c,a);
f(i,b);
fac(a,b,c);
}
k=qiu(c);
printf("计算结果:\n");
for(i=k-1;i>=0;i--) {
printf("%d",c[i]);
}
printf("\n");
}
return 0;
}

//本函数是求两个数之积的高精度乘法,并输出两个数之积为数组c
int fac(int a[],int b[],int c[])
{
int i,j,m=0,n=0,k=0;
m=qiu(a);
n=qiu(b);
for(j=0;j<n;j++){
for(i=0;i<m;i++) {
c[i+j]=c[i+j]+a[i]*b[j];
while(c[i+j]>=10)
{
c[i+j]=c[i+j]-10;
c[i+j+1]=c[i+j+1]+1;
}
}
}
return 0;
}

void main(){
int n;
printf("请输入N的值:\n");
scanf("%d",&n);
fun(n);
return 0;
}

可以运行 结果也没有问题 如果有不懂的 可以加我QQ 354156421

③ 高精度乘法找错 C语言

仔细调试了一下

#include <iostream>
using namespace std;
int main ()
{
char a[10000],b[10000],t;
int i,j,c[20001]={0},q,w;
int lc;

cin>>a>>b;q=strlen(a);w=strlen(b);
for (i=0;i<q/2;i++){t=a[i];a[i]=a[q-i-1];a[q-i-1]=t;}
//原来下句是 for (i=0;i<w/2;i++){t=a[i];a[i]=a[w-i-1];a[w-i-1]=t;} 应该是交换b数组,可能粗心了
for (i=0;i<w/2;i++){t=b[i];b[i]=b[w-i-1];b[w-i-1]=t;}

//我令lc变量存储结果的长度
lc=q+w;

//先不管三七二十一,加起来
for (i=0;i<q;i++)
for (j=0;j<w;j++)
{
c[i+j]+=(a[i]-'0')*(b[j]-'0');
}

//考虑进位,最后一起考虑
for (i=0;i<lc;++i)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}

//去除首位的0
while (c[lc]==0 && lc>0) lc--;

//输出结果
while (lc>=0) cout<<c[lc--];
cout<<endl;

system("pause");

return 0;
}

//现在应该就对了,我试过:)

④ C语言高精度教程

高 精 度 算 法
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
int an,bn,fa=1,fb=1; /* 把an,bn,k设为全局变量,an纪录第一个高精度数组的位数,bn纪录第二个高精度数组的位数,k纪录输出结果的位数*/
char b1[250], b2[250]; /*纪录需要计算的两个高精度数据 */
void input(int a1[],int a2[]) /*函数input为输入函数,用来纪录两个待计算的高精度数据,以数组首地址为参数.以实现返回两个高精度数据*/
{
int i,ai=1,bi=1;
scanf ( "%s%s", b1, b2 ); /*输入两个高精度数据 */
an = strlen( b1 ); /*an纪录b1的位数 */
bn = strlen( b2 ); /*bn纪录b2的位数 */
if(b1[0]==45) { an--; fa=-1;ai=0;} /*判断数组的符号 */
if(b2[0]==45) { bn--; fb=-1;bi=0;}
for (i=0; i<an; i++,ai++) {a1[i]=b1[an-ai]-'0'; printf("%d",a1[i]);} /*把字符形数据b1转为整数形数据,同样用数组纪录 */
for (i=0; i<bn; i++,bi++) a2[i]=b2[bn-bi]-'0'; /* 同上 */
return;
}
void addition(int a[],int b[],int q) /*高精度加法运算*/
{
int i,c[251]={0},k;
if(fa*fb>0||q)
{
if(an>bn) k=an;
else k=bn; /*用k纪录结果的最小位数*/
for(i=0;i<k;i++)
{
c[i]=a[i]+b[i]+c[i];
c[i+1]=(int)c[i]/10;
c[i]=(int)c[i]%10;
} /*高精度加法运算过程*/
if(c[k]) k++; /*判断最后结果的位数*/
if(fa<0&&q||fa<0) printf("-");
for(i=k-1;i>=0;i--) printf("%d",c[i]); /*输出结果*/
return;
}
return;
}void subtraction(int a[],int b[],int q) /*高精度减法运算*/
{
int i,f=0,c[251]={0},k;
if(fa*fb>0||q)
{
if(an>bn) k=an;
else /*用k纪录结果的最大位数*/
{ k=bn;
for(i=k;a[i]<=b[i]&&i>=0;i--)
if(a[i]<b[i]) f=1; /*f纪录结果符号*/
} if(!f) /*高精度减法运算过程*/
for(i=0;i<k;i++)
{
if(a[i]<b[i])
{ a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
else /*当a<b时的处理*/
for(i=0;i<k;i++)
{
if(b[i]<a[i])
{ b[i+1]--;
b[i]+=10;
}
c[i]=b[i]-a[i];
}
while(!c[k-1]&&k>1) k--; /*判断最后结果的位数*/
if(q&&(fa>0&&f||fa<0&&!f)||fa>0&&(fb>0&&!f||f&&!q)) printf("-"); /*如果f为真是输出负号*/
for(i=k-1;i>=0;i--) printf("%d",c[i]);
return;
}
} void multiplication( int a[], int b[]) /*高精度乘法运算*/
{
int i, j, c[501] = {0},k;
k = an + bn - 1; /*用k纪录结果的最大位数*/
for(i = 0; i < an; i++) /*高精度乘法运算过程*/
for(j = 0;j < bn; j++)
{
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;
}
while(!c[k]) k--; /*判断最后结果的位数*/
if(fa*fb<0) printf("-");
for(i = k; i >= 0; i--) printf("%d",c[i]); /*输出结果*/
}
main()
{
int a[250]={0},b[250]={0};
input(a,b);
printf("\n%s+%s=",b1,b2);addition(a,b,0);
printf("\n%s-%s=",b1,b2);subtraction(a,b,0);
printf("\n%s*%s=",b1,b2);multiplication(a,b);
getchar();
}
1、 高精度除以低精度;
算法:按照从高位到低位的顺序,逐位相除。在除到第j位时,该位在接受了来自第j+1位的余数后与除数相除,如果最高位为零,则商的长度减一。源程序如下:
#include <stdio.h>
#define N 500
main()
{
int a[N] = {0}, c[N] = {0};
int i, k, d, b;
char a1[N];
printf("Input 除数:");
scanf("%d", &b);
printf("Input 被除数:");
scanf("%s", a1);
k = strlen(a1);
for(i = 0; i < k; i++) a[i] = a1[k - i - 1] - '0';
d = 0;
for(i = k - 1; i >= 0 ; i--)
{
d = d * 10 + a[i];
c[i] = d / b;
d = d % b;
}
while(c[k - 1] == 0 && k > 1) k--;
printf("商=");
for(i = k - 1; i >= 0; i--) printf("%d", c[i]);
printf("\n余数=%d", d);
} 2、高精度乘以高精度(要求用尽可能少的存储单元);
算法:用数组保存两个高精度数,然后逐位相乘,注意考虑进位和总位数。源程序如下:
#include <stdio.h>
main()
{
int a[240] = {0}, b[240] = {0}, c[480] = {0};
int i, j, ka, kb, k;
char a1[240], b1[240];
gets(a1);
ka = strlen(a1);
gets(b1);
kb = strlen(b1);
k = ka + kb;
for(i = 0; i < ka; i++) a[i] = a1[ka-i-1] - '0';
for(i = 0; i < kb; i++) b[i] = b1[kb-i-1] - '0';
for(i = 0; i < ka; i++)
for(j = 0; j < kb; j++)
{
c[i + j] = c[i + j] + a[i] * b[j];
c[i + j +1] = c[i + j +1] + c[i + j]/10;
c[i + j] = c[i + j] % 10;
}
if(!c[k]) k--;
for(i = k-1; i >= 0; i--) printf("%d", c[i]);
} 3、高精度除以高精度(要求用尽可能少的存储单元);
算法:用计算机模拟手算除法,把除法试商转化为连减。
#include <stdio.h>
#define N 500
int bj(int a[], int b[], int k1, int k2) /*比较大小函数*/
{
int i, t, flag; /*flag作标志位*/
if(k1 < k2)
flag = 0; /*被除数小于除数返回0*/
else if(k1 > k2)
flag = 1; /*被除数大于除数返回1*/
else
{ /*被除数和除数位数相等则逐位进行比较*/
i = k1;
t = 0;
while(t == 0 && i > 0)
{
if(a[i] > b[i]) {t = 1; flag = 1;}
else if(a[i] == b[i]) i--;
else {t = 1; flag = 0;}
}
if(i == 0 && t == 0) flag = 2; /*被除数等于除数返回2*/
}
return flag;
}
int jf(int a[], int b[], int k1, int k2) /*减法运算*/
{
int i, k, d[N];
for(i = 0; i < k2; i++) d[i] = b[i]; /*把除数赋给数组d*/
for(i = k2; i < N; i++) d[i] = 0; /*d数组无数据的高位置0*/
k = k1 - k2 - 1; /*计算减法起始位置*/
if(k < 0) k = 0;
if(k > 0)
{
for(i = k2 - 1; i >= 0; i--) d[i + k] = d[i]; /*移动减数位数与被减数对齐*/
for(i = 0; i < k; i++) d[i] = 0; /*移动后的其余位置0*/
}
for(i = 0; i < k1; i++)
{
if(a[i] >= d[i]) a[i] -= d[i];
else
{
a[i + 1] = a[i + 1] - 1;
a[i] = 10 + a[i] - d[i];
}
}
return k;
}
main()
{
int a[N] = {0}, b[N] = {0}, c[N] = {0}, d[N] = {0};
int i, ka, kb, m, t, t1, t2, k, x, kd, kk;
char a1[N], b1[N];
printf("Input 被除数:");
scanf("%s", a1);
ka = strlen(a1);
for(i = 0; i < ka; i++) a[i] = a1[ka - i -1] - '0';
printf("Input 除数:");
scanf("%s", b1);
kb = strlen(b1);
for(i = 0; i < kb; i++) b[i] = b1[kb - i -1] - '0';
kd = ka; /*保存被除数位数 */
t2 = bj(a, b, ka, kb);
m = 0;
do
{
while(a[ka - 1] == 0) ka--;
t = bj(a, b, ka, kb);
if(t >= 1)
{
k = jf(a, b, ka, kb);
c[k]++;
if(k > m) m = k;
t1 = 0;
for(i = k; i <= m; i++)
{
x = c[i] + t1;
c[i] = x % 10;
t1 = x / 10;
}
if(t1 > 0) {m++; c[m] = t1; }
}
}while(t == 1);
if(t2 == 0)
{
printf("商=0");
printf("\n余数=");
for(i = kd - 1; i >= 0; i--) printf("%d", a[i]);
exit(1);
}
if(t2 == 2)
{
printf("商 = 1");
printf("\n余数 = 0");
exit(1);
}
kk = kd;
while(!c[kd - 1]) kd--;
printf("商 = ");
for(i = kd - 1; i >= 0; i--) printf("%d", c[i]);
while(!a[kk]) kk--;
printf("\n余数 = ");
if(kk < 0)
{
printf("0");
exit(1);
}
for(i = kk; i >= 0; i--) printf("%d", a[i]);
}
4、 N!,要求精确到P位(0〈P〈1000〉。
算法:结果用数组a保存,开始时a[0]=1,依次乘以数组中各位,注意进位和数组长度的变化。源程序如下:
#include <stdio.h>
#define M 1000
main()
{
int a[M], i, n, j, flag = 1;
printf("n=");
scanf("%d",&n);
printf("n!=");
a[0] = 1;
for(i = 1; i < M; i++) a[i] = 0;
for(j = 2; j <= n; j++)
{
for(i = 0; i < flag; i++) a[i] *= j;
for(i = 0; i < flag; i++)
if(a[i] >= 10)
{
a[i+1] += a[i]/10;
a[i] = a[i] % 10;
if(i == flag-1) flag++;
}
}
for(j = flag - 1; j >= 0; j--)
printf("%d", a[j]);
}

⑤ C语言的高精度算法与程序

。。
高精度加法:
#include <stdio.h>
main()
{ int a[240]={0},b[240]={0},c[241]={0};
int i,ka,kb,k;
char a1[240],b1[240];
gets(a1);ka=strlen(a1);
gets(b1);kb=strlen(b1);
if(ka>=kb) k=ka;
else k=kb;
for(i=0;i<ka;i++) a[i]=a1[ka-i-1]-'0';
for(i=0;i<kb;i++) b[i]=b1[kb-i-1]-'0';
for(i=0;i<k;i++)
{c[i]=a[i]+b[i]+c[i];<br> c[i+1]=c[i+1]+c[i]/10;<br> c[i]=c[i]%10;<br> }
if(c[k]) k++;
for(i=k-1;i>=0;i--) printf("%d",c[i]);
system("pause");
}

高精度减法。。
#include <stdio.h>
main()
{ int a[240]={0},b[240]={0};
int i,la,lb;
char a1[240],b1[240];
gets(a1);la=strlen(a1);
gets(b1);lb=strlen(b1);
for(i=0;i<la;i++) a[i]=a1[la-i-1]-'0';
for(i=0;i<lb;i++) b[i]=b1[lb-i-1]-'0';
if(la>lb)
{for(i=0;i<la;i++)<br> {if(a[i]<b[i])<br> {a[i+1]--; <br> a[i]+=10;<br> }
a[i]=a[i]-b[i];
}
while(!a[la-1])
{la--;<br> if(!la) {printf("0"); break;}
}
for(i=la-1;i>=0;i--) printf("%d",a[i]);
}
else
{for(i=0;i<lb;i++)<br> {if(b[i]<a[i])<br> {b[i+1]--; <br> b[i]+=10;<br> }
b[i]=b[i]-a[i];
}
while(!b[lb-1])
{lb--;<br> if(!lb) {printf("0"); break;}
}
printf("-");
for(i=lb-1;i>=0;i--) printf("%d",b[i]);
}
system("pause");
}

高精度乘法:
#include<stdio.h>
#include<string.h>
int a[2505],b[2505],x[5010]={0};
main()
{ int i,j,k,lena,lenb,t;
char temp[10010];
scanf("%s",temp);
lena=strlen(temp);
if(lena%4)
{ t=4-lena%4;
for(i=t+lena-1;i>=t;i--) temp[i]=temp[i-t];
temp[t+lena]='\0';
lena+=t;
for(i=0;i<t;i++) temp[i]='0';
}
for(i=0,j=1;i<lena;i+=4,j++)
a[j]=(temp[i]-'0')*1000+(temp[i+1]-'0')*100+(temp[i+2]-'0')*10+temp[i+3]-'0';
lena=j;
scanf("%s",temp);
lenb=strlen(temp);
if(lenb%4)
{
t=4-lenb%4;
for(i=t+lenb-1;i>=t;i--) temp[i]=temp[i-t];
temp[t+lenb]='\0';
lenb+=t;
for(i=0;i<t;i++) temp[i]='0';
}
for(i=0,j=1;i<lenb;i+=4,j++)
b[j]=(temp[i]-'0')*1000+(temp[i+1]-'0')*100+(temp[i+2]-'0')*10+temp[i+3]-'0';
lenb=j;
for(i=lena-1;i>0;i--)
for(j=lenb-1;j>0;j--)
{
t=i+j;
x[t]+=a[i]*b[j];
x[t-1]+=x[i+j]/10000;
x[t]=x[t]%10000;
}
while(!x[i]) i++;
printf("%d",x[i]);
i++; for(;i<lena+lenb-1;i++)
if(x[i]>1000) printf("%d",x[i]);
else
if(x[i]>100) printf("0%d",x[i]);
else
if(x[i]>10) printf("00%d",x[i]);
else printf("000%d",x[i]);
system("pause");
}

。。

⑥ C语言高精度计算 整数减法

#include<stdio.h>
#include<string.h>
#include<malloc.h>

constintMAXSIZE=200+1;

//完成以字符串形式的两个大数相加。返回字符串形式的和。
//tatol←addnum1+addnum2
char*LargeNumberAdd(charconst*addnum1,charconst*addnum2,char*total){
inti,j,k=0,len,result,carry=0;
intlen1=strlen(addnum1);
intlen2=strlen(addnum2);
for(i=len1-1,j=len2-1;i>=0&&j>=0;--i,--j){
result=addnum1[i]-'0'+addnum2[j]-'0'+carry;
carry=result/10;
total[k++]=result%10+'0';
}
while(i>=0){
result=addnum1[i--]-'0'+carry;
carry=result/10;
total[k++]=result%10+'0';
}
while(j>=0){
result=addnum2[j--]-'0'+carry;
carry=result/10;
total[k++]=result%10+'0';
}
total[k]='';
len=strlen(total);
for(i=0;i<len/2;++i){
k=total[i];
total[i]=total[len-1-i];
total[len-1-i]=k;
}
returntotal;
}

//完成以字符串形式的两个大数相减。返回字符串形式的差。
//difference←subnum1-subnum2
char*LargeNumberSub(char*subnum1,char*subnum2,char*difference){
inti,j,k,result,borrow=0;
intsign=0,swap=0;
char*pta,*ptb;
intlen1=strlen(subnum1);
intlen2=strlen(subnum2);
if(len1==len2){
for(i=0;i<len1;++i){
if(subnum1[i]<subnum2[i]){
swap=1;
break;
}
}
}
if(len2>len1||swap==1){
pta=(char*)malloc((len2+1)*sizeof(char));
ptb=(char*)malloc((len1+1)*sizeof(char));
strcpy(pta,subnum2);
strcpy(ptb,subnum1);
k=len1;
len1=len2;
len2=k;
sign=1;
}
else{
pta=(char*)malloc((len1+1)*sizeof(char));
ptb=(char*)malloc((len2+1)*sizeof(char));
strcpy(pta,subnum1);
strcpy(ptb,subnum2);
}
for(i=len1-1,j=len2-1,k=0;i>=0&&j>=0;--i,--j){
result=pta[i]-ptb[j]-borrow;
if(result<0){
result+=10;
borrow=1;
}
elseborrow=0;
difference[k++]=result+'0';
}
while(i>=0){
result=pta[i]-'0'-borrow;
if(result<0){
result+=10;
borrow=1;
}
elseborrow=0;
--i;
difference[k++]=result+'0';
}
if(sign)difference[k++]='-';
difference[k]='';
for(i=0;i<k/2;++i){
result=difference[i];
difference[i]=difference[k-1-i];
difference[k-1-i]=result;
}
free(pta);
free(ptb);
returndifference;
}

intmain(){
chars[MAXSIZE]="1234567";
chart[MAXSIZE]="87086543";
charresult[MAXSIZE+1];
printf("%s+%s=%s ",s,t,LargeNumberAdd(s,t,result));
printf("%s-%s=%s ",s,t,LargeNumberSub(s,t,result));
return0;
}

⑦ c语言 高精度乘法总是超时………………

你在数组初始化时,赋给它'\0',其值在首地址中,但之后你又在首地址中赋了字符,之后又没有结束语句,导致得不出结果

⑧ c语言高精度计算

不是我写的,,帮你找到的。。
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include"stdlib.h"

voidmain()
{
intn=0,i=0,j=0,k=0,b=0;
chara[3][500]={0};
intn1=0,n2=0;
chars[500]={0};
intn3=0;
intc=0,c1=0;
inttemp=0;
charop;
charstr[1001]={0};
char*result;

scanf("%d",&n);
result=(char*)malloc(501*n);//根据输入的n申请内存空间
*result='';

/*每次循环都要初始化*/
for(;i<n;i++)
{
//gets(str);
for(j=0;j<500;j++)
{
a[0][j]='';a[1][j]='';a[2][j]='';
s[j]='';
str[j]='';
str[1000-j]='';
}
c=0;c1=0;
k=0;
n1=0;n2=0;n3=0;

/*分离输入的字符串*/
scanf("%s",&str);
for(j=0;str[j];j++)
{
if(str[j]!='+'&&str[j]!='-')
a[k][j-n1]=str[j];
else
{
op=str[j];
k=1;
n1=strlen(a[0])+1;
}
}//forj
n1-=2;
n2=strlen(a[1])-1;
n3=n1>n2?n1:n2;

/*计算加法*/
if(op=='+')
{
for(;n1>=0&&n2>=0;n1--,n2--,n3--)
{
temp=a[0][n1]+a[1][n2]-96;
temp+=c;
if(temp>=10)
{
s[n3]=temp%10+48;
c=1;
}
else
{
s[n3]=temp+48;
c=0;
}
}//for
while(n1>=0)
{
temp=a[0][n1]-48;
temp+=c;
if(temp==10)
{
s[n3]=48;
c=1;
}
else
{
s[n3]=temp+48;
c=0;
}
n1--;
n3--;
}//whilen1
while(n2>=0)
{
temp=a[1][n2]-48;
temp+=c;
if(temp==10)
{
s[n3]=48;
c=1;
}
else
{
s[n3]=temp+48;
c=0;
}
n2--;
n3--;
}//whilen2
if(c)
strcat(result,"1");
strcat(result,s);
strcat(result," ");
}//ifop

/*计算减法*/
else
{/*保证减数大于被减数
*如果被减数大于减数,则交换2数,并设置变量
*/
if(strcmp(a[0],a[1])<0)
{
//a[2]=a[0];a[0]=a[1];a[1]=a[2];
for(b=0;b<3;b++)
{
j=(b+2)%3;
for(k=0;k<=n2;k++)
a[j][k]=a[b][k];
}
n2=n1;n1=n3;
c1=1;//正为0,负为1
}

/*计算减法*/
for(;n2>=0;n1--,n2--,n3--)
{
temp=a[0][n1]-a[1][n2];
temp-=c;
if(temp>=0)
{
s[n3]=temp+48;
c=0;
}
else
{
s[n3]=temp+58;
c=1;
}
}//for
while(n1>=0)
{
temp=a[0][n1]-48;
temp-=c;
if(temp>=0)
{
s[n3]=temp+48;
c=0;
}
else
{
s[n3]=temp+58;
c=1;
}
n1--;
n3--;
}

if(c1)
strcat(result,"-");

/*消除减法结果高位的0*/
j=0;
while(s[j]==48)
j++;
strcat(result,s+j);
strcat(result," ");
}//elseop
}//fori
printf("%s",result);
getch()();
}

⑨ c语言高精度乘法分治法空间复杂度是多少

intQuickAdd(intnum[],intnBegin,intnEnd){if(nBegin>=nEnd){returnnum[nBegin];}else{returnnum[nBegin]+QuickAdd(num,nBegin+1,nEnd);}}intmain(){inta[]={1,2,3,4,5,6};intnSum=QuickAdd(a,0,5);return1;}