大數相乘c語言
A. c語言大整數乘法
dc這個函數裡面連b這個參數都沒有使用,這也能出結果...,
if(z[0]='0')continue 也寫錯了
不是打擊你,你的代碼太濫了,實在不想去找錯誤,給你我以前寫的代碼吧,你自己整理一下
#include <stdio.h>
int mulx(char * a,int b,char * r,int d);
void init(char * s);
char buf1[4*1024];
char buf2[4*1024];
char buf3[4*1024];
int main()
{
char * a;
char * b;
char * r;
char * t;
int d;
int i;
a = buf1;
b = buf2;
r = buf3;
init(NULL);
while(scanf("%s %d",a,&d)!=EOF)
{
mulx(a,d,r,10);
printf("%s\n",r);
}
return 0;
}
char c2d[256]; //字元轉換成數字
char * charset; //代表數字的字元
/*功能:設置使用那些字元表示數字,默認的為"0123456789ABCDEF"*/
/*參數:*/
/*返回值:*/
void init(char * s)
{
int i;
if(s==NULL)
charset = "0123456789ABCDEF";
else
charset = s;
for(i=0;i<256;i++)
c2d[i] = 0;
for(i=0;charset[i];i++)
c2d[charset[i]] = i;
}
/*功能:清除前導零*/
/*參數:需要清楚的數字*/
/*返回值:清零後數字的位數*/
int clearZeros(char * a)
{
int i,j;
for(i=0;a[i]==charset[0];i++);
for(j=0;a[i];i++,j++)
a[j] = a[i];
a[j] = 0;
if(j==0)
{
a[j++] = charset[0];
a[j] = 0;
}
return j;
}
/*功能:乘,用於進制轉換之類*/
/*參數: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,t;
if(r==NULL)
r = a;
for(i=0;a[i];i++);
len = k = i;
for(c=0,i--,r[k--]=0;i>=0 ;i--,k--)
{
t = c2d[a[i]] * b + c ;
c = t/d;
r[k] = charset[t%d];
}
if(c)
{
for(i=len,j=++len;i>=0;i--,j--)
r[j] = r[i];
r[0]=charset[c];
}
return len;
}
B. c語言中用分治法求大數相乘的代碼
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define N 100//最大100位
/* 函數聲明 */
void calc1(char* str1,int len1,int* tmp,int m);
void accumulate(int cnt,int* res,int res_len,int* tmp,int tmp_len);
char* bignum_multi(char* str1,int len1,char* str2,int len2,char* result,int len);
int main()
{
int i,j;
/* 獲取計算數據(可以從文件中讀取) */
char str1[N]={NULL};
char str2[N]={NULL};
char result[N*N]={NULL};
printf("Input Num1: \n");
scanf("%s",str1);
fflush(stdin);
printf("Input Num2: \n");
scanf("%s",str2);
/* 計算兩個字元串的長度,及存儲結果所需要的空間 */
int len1=strlen(str1),len2=strlen(str2);
int len=len1+len2;
/* 計算並輸出計算結果 */
printf("The result is: %s\n",bignum_multi(str1,len1,str2,len2,result,len));
return 0;
}
/*===============================================================
調用calc1和accumulate函數計算大數相乘
===============================================================*/
char* bignum_multi(char* str1,int len1,char* str2,int len2,char* result,int len)
{
int i,j,m=0,cnt=0,*tmp,*res;
/* 分配臨時結果的存放空間 */
tmp=(int*)malloc((len1+1)*sizeof(int));
res=(int*)malloc(len*sizeof(int));
/* 初始化兩個數組 */
for(i=0;i<len1;i++)
tmp[i]=0;
for(j=0;j<len;j++)
res[j]=0;
for(i=len2-1;i>=0;i--)
{
/* 獲取乘數中第i位的值 */
m=str2[i]-'0';
/* 計算被乘數與第i位的乘積,結果保存在tmp整型數組中 */
calc1(str1,len1,tmp,m);
/* 將tmp數組中的值加到res數組中 */
cnt++;
accumulate(cnt,res,len,tmp,len1+1);
}
/* 將整形數組res中的值轉化成字元串存入result中 */
i=0;j=0;
/* 去掉res中第一個非零數字前的零 */
while(res[i++]==0);
for(m=i-1;m<len;m++,j++)
result[j]=res[m]+0x30;
result[j]='\0';
free(tmp);
free(res);
return result;
}
/*===============================================================
計算被乘數與乘數的某一位的乘積
===============================================================*/
void calc1(char* str1,int len1,int* tmp,int m)
{
/* d兩個位的乘積結果,remainder余數,carry進位 */
int i,d=0,remainder=0,carry=0;
/* 從被乘數字元串'\0'的前一位算起 */
for(i=len1-1;i>=0;i--)
{
d=str1[i]-'0';
d*=m;
remainder=(d+carry)%10;
carry=(d+carry)/10;
tmp[i+1]=remainder;
}
if(carry)
tmp[0]=carry;
else
tmp[0]=0;
}
/*===============================================================
將被乘數與乘數中一位數字的乘積結果計入res數組中
===============================================================*/
void accumulate(int cnt,int* res,int len,int* tmp,int len1)
{
int m=0,n=0,i,k,remainder=0;
static int carry=0;
for(k=len1-1,i=0;k>=0;k--,i++)
{
m=tmp[k];
n=res[len-cnt-i];
if(m+n+carry>=10)
{
remainder=(m+n+carry)%10;
carry=1;
}
else
{
remainder=m+n+carry;
carry=0;
}
res[len-cnt-i]=remainder;
}
}
C. c語言 大整數乘法
#include <stdio.h>
#include<string.h>
int main()
{
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(b)-1);
for (;k>=1;k--)
{
c[k-1]+=c[k]/10;
c[k]=c[k]%10; //這一步會將c[k]破壞,所以倒轉
}
if(c[0]!='0') //若最高位為0,則不輸出;
printf("%c",c[0]);
j=strlen(a)+strlen(b);
for (i=1;i<j;i++)
{
printf("%d",c[i]);
}
return 0;
}
======================================
系統報錯的原因是c[1]是char型,不是字元串數組,要用%c而是%s,我想你是把i寫成了1了
D. 求一C語言編程:求兩個大數的乘積。
看到這個問題後編啦兩天才出來
兄台真的累啊
我是個新手 有些累贅的地方或不扒亂殲足的地方多多包涵
/* 大數相乘 */
#include "stdio.h"
void main()
{
char a[100],b[100];
int i,j,k,l,m,t,n,h,f,a1[100],b1[100],c[100][100]={0},d[100];
printf("Input the first Number:"); //以字元形式輸春沖入第一個大數
for(i=0;;i++)
{
a[i]=getchar();
if(a[i]=='\n') break;
}
printf("Input the second Number:"); //以字元形式輸入第二個大數
for(j=0;;j++)
{
b[j]=getchar();
if(b[j]=='\n') break;
}
for(k=0;k<i;k++) //字元轉換成數組
{
a1[k]=a[k]-48;
}
for(k=0;k<j;k++)
{
b1[k]=b[k]-48;
}
for(k=i-1;k>=0;k--) //數組1的每位數分別乘數組2
{
h=0;
for(l=j-1,m=0;l>=0;m++) //******
{
f=100-(i-1-k)-m;
t=c[k][f]=h+a1[k]*b1[l--];
c[k][f]=t%10;
h=t/10;
}
if(t>=10) c[k][f]=h;
}
for(h=100;h>0;h--) d[h]=c[0][h];
陪此for(k=1;k<i;k++)
{
for(m=100;m>0;m--)
{
t=d[m]+c[k][m]+h;
d[m]=t%10;
h=t/10;
}
}
printf("The answer is :\n ");
for(i=0;i<=100;i++)
{
if(d[i]!=0)
{
for(;i<=100;i++) printf("%d",d[i]);
break;
}
}
}
E. c語言大整數乘法
#include<stdio.h>
#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[0] == '-')
fuhao2 = -1;
else fuhao2 = 1;
strcpy(c,b+1);
strcpy(b,c);
}
int i , j;
for(i = 0; i< 10000;i++){
c[i] = '鄭衫0';
}
int lena = strlen(a);
int lenb = strlen(b);
for(i = lena-1;i >=0;i--){
int k = 0;
for(j = lenb-1;j >=0;j--) {
char l = c[i+j+1];
c[i+j+1] = (c[i+j+1]-'0'+(b[j]-'0')*(a[i]-'0')+k)%10+'0';
k = (l-'0'+(b[j]-'0') * (a[i] -'0')+k)/10;
}
if(k!= 0) c[i] += k;
}
i = 0;
j = 0;
while(c[i] == '0') i++;
while(i <= lena+lenb-1) {
a[j] = c[i];
j ++;
i ++;
}
a[j] = '銷逗\0';
if(a[0] == '\0') a[0] = '0',a[1] = '\0';
if(fuhao1*fuhao2 == -1 && a[0] !='0') {
strcpy(c,a);
a[0] = '-';
a[1] = '\0';
strcat(a,c);
}
}
int main()
{
char a[10000],b[10000];
while(scanf("%s %s",a,b) == 2) {
chengfa(a,b);
printf("%s\喊斗腔n",a);
}
}
/*
//測試數據
3 4
12
1782362317836127863178 5
8911811589180639315890
2364782367834627864826 23478962483263478
*/
F. 關於C語言兩個大數相乘
//#include
<stdafx.h>
//此頭文件不可丟
#include
<stdio.h>
#include
<string.h>
#define
N
200
//預編譯將後面數組的的長度定義為200;
int
main()
{
void
GetDigits(int
a[],
char
s[]);
void
multiply(int
a[],
int
b[],
int
c[]);
char
s1[N],
s2[N];
//起初定義兩個字元串數組s1和s2,用來存儲兩個判塌簡相乘的大數掘褲;
int
i,
j,
a[N],
b[N],
c[N
*
2];
printf("\n
input
number
a:
");//輸入兩個數字的字元串;
scanf("%s",
s1);
printf("\衫明n
input
number
b:
");
scanf("%s",
s2);
//把輸入的字元串,按位存放到數組
GetDigits(a,
s1);
GetDigits(b,
s2);
multiply(a,
b,
c);
//找到最高位
j
=
N
*
2
-
1;
while(c[j]
==
0)
j--;
//列印計算結果
printf("\n
%s
*
%s=",
s1,
s2);
for(i
=
j;
i
>=
0;
i--)
printf("%d",
c[i]);
return
0;
}
//下面Getsights函數的目的是把字元串形式的數字按位存放到數組
void
GetDigits(int
*a,
char
*s)
{
int
i;
char
digit;
int
len
=
strlen(s);
for(i
=
0;
i
<
N;
i++)
a[i]
=
0;
for(i
=
0;
i
<
len;
i++)
{
digit
=
s[i];
a[len
-
1
-
i]
=
digit
-
'0';
}
}
//把a*b的結果存儲到數組c中,按位表示;
void
multiply(int
*a,
int
*b,
int
*c)
{
int
i,
j;
for(i
=
0;
i
<
N
*
2;
i++)
c[i]
=
0;
//先把結果數組設置為0;
for(i
=
0;
i
<
N;
i++)
for(j
=
0;
j
<
N;
j++)
c[i
+
j]
+=
a[i]
*
b[j];
//
處理進位
for(i
=
0;
i
<
N
*
2
-
1;
i++)
{
c[i
+
1]
+=
c[i]
/
10;
//進位累加到高位
c[i]
=
c[i]
%
10;
//該位的最後結果
}
}
G. C語言大整數相乘
我用C語言寫了一個,在VC2005下測試通過。
#include <stdio.h>
#include <string.h>
typedef unsigned char CHAR;
typedef unsigned int UINT;
/*十進制形式的a與b,注意低位在前高位在後*/
CHAR a[10000];/*被乘數*/
CHAR c[20000];/*乘積和乘數*/
UINT temp1,temp2;/*用來存放中間結果*/
UINT da, db; /*記錄a和b的位數*/
/*清零*/
void Zero( CHAR* x, UINT n )
{
UINT i;
for ( i = 0; i < n; i ++ )
x[i] = '0';
}
CHAR CharToNum( CHAR c )
{
return c - 0x30;
}
CHAR NumToChar( CHAR c )
{
return c + 0x30;
}
/*這個函數模擬大整數的左移*/
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;
UINT cm = 0; /*乘法進位*/
UINT ca = 0; /*加法進位*/
if ( y != 0 ) {
for ( i = 0; i < da; i ++ ) {
/*乘*/
temp1 = ((UINT)a[i]) * y + cm;
cm = temp1 / 10;
temp1 %= 10;
/*加*/
temp2 = ((UINT)c[i+10000]) + temp1 + ca;
if ( temp2 > 9 ) {
ca = 1;
temp2 -= 10;
} else {
ca = 0;
}
c[i+10000] = temp2;
}
c[da+10000] += cm + ca;
}
else {
/*如果被乘數本位是0就直接返回*/
return;
}
}
/*這個函數用來輸出*/
void OutputResult()
{
CHAR* p = c + 20000;
while( *p == 0 ) {
p --;
}
printf("乘積是:\n");
while( *p != 'x' ) {
printf("%d", *p);
p --;
}
}
void main()
{
Zero( a, 10000 );
Zero( c, 10000 );
printf("輸入被乘數:");
scanf("%s",a);
printf("輸入乘數:");
scanf("%s",c);
/*記錄位數*/
da = strlen( (const char*)a );
db = strlen( (const char*)c );
/*反轉以使低位在前*/
strrev( (char*)a );
strrev( (char*)c );
UINT i;
/*a與b存儲的是char字元,減去0x30就能直接當數字使用了*/
for ( i = 0; i < 10000; i ++ ) {
if ( a[i] != '\0' ) {
a[i] = CharToNum( a[i] );
}
}
for ( i = 0; i < 20000; i ++ ) {
if ( c[i] != '\0' ) {
c[i] = CharToNum( c[i] );
}
}
/*這個乘法演算法可以參看二進制乘法器的原理*/
for ( i = 0; i < db; i ++ ) {
OneDigitMultiply( c[0] );
LShift(c, 20000);
}
c[10000-db-1] = 'x'; /*給數字尾部作個標記*/
OutputResult();
getchar();
getchar();
}
第二題:
#include <stdio.h>
void main()
{
float a;
scanf("%f",&a);
if ( a - (int)a == 0 ) {
printf("是整數\n");
}
else {
printf("不是整數\n");
}
getchar();
getchar();
}
H. C語言 大數乘法
是a[j++]=str1[i]-'0'; 這個沒看懂嗎?
因為字元輸入存的是ASCII碼。所以字元串』0『其實在內存里晌廳不是存的0而且一個別的數字。
這里利用到ASCII排序的規律,只要減去做謹橋』0『這個碼的值就能得到相應的字元數字的對應整形值了。
http://ke..com/view/15482.htm 這個是ASCII碼的表 你純猛看下就應該明白了
I. 用分治法怎麼寫大整數乘法的演算法(用c語言寫)
//大數的乘法,以前寫的
#include<iostream>
#include<string>
usingnamespacestd;
voidtoInt(char*s,int*in)
{
inti;
strrev(s);
for(i=0;i<strlen(s);i++)
{
in[i]=s[i]-'0';
}
}
voidrevint(int*in,intn)
{
inti,temp;
for(i=0;i<n/2;i++)
{
temp=in[i];
in[i]=in[n-i-1];
in[n-i-1]=temp;
}
}
intmain()
{
charc1[200],c2[200];
inta1[200]={0}; //大數1
inta2[200]={0}; //大數2
intr2[300]={0}; //保存大結果
intf=0; //保存進位
inti,j;
cin>>c1>>c2;
if(strcmp(c1,"0")!=0&&strcmp(c2,"0")!=0)
{
intlen1=strlen(c1);
intlen2=strlen(c2);
intmaxlen=len1+len2; //結果的最大位數
toInt(c1,a1);
toInt(c2,a2);
for(j=0;j<len2;j++)
{
intr1[200]={0}; //保存小結果
for(i=0;i<=len1;i++)
{
r1[i]=a2[j]*a1[i]+f;
if(r1[i]>9)
{
f=r1[i]/10;
r1[i]%=10;
}
else
{
f=0;
}
}
for(i=0;i<=len1;i++)
{
r2[j+i]+=r1[i];
if(r2[i+j]>9)
{
r2[i+j+1]+=r2[i+j]/10;
r2[i+j]%=10;
}
}
f=0;
}
revint(r2,maxlen);
if(r2[0]!=0)
cout<<r2[0];
for(i=1;i<maxlen;i++)
cout<<r2[i];
}
else
cout<<"0";
cout<<endl;
return0;
}
J. C語言,求兩個大整數的乘積,解釋詳細一點。
/*
高精度乘法輸入:兩行,每行表示一個非負整數(不超過10000位)
輸出:兩數的乘積。
*/
#include <stdio.h>
#include <襪缺string.h>
#include <stdlib.h>
#define MAX 10001
int bigchenfa(int *sum,int *a,int *b,int la,int lb) /*高精度乘法*/
{
int i,j,lsum = 0 ;
memset(sum,0,sizeof(sum));
for(i=1 ; i<= la ; i++) /*用數組模擬運算*/
for(j=1,lsum=i-1; j<= lb ; j++)
sum[++lsum] += b[j] * a[i] ;
for(i=1 ; i<= lsum ; i++)/*進位處輪猜理*/
if (sum[i] >= 10)
{
if ( sum[lsum] >= 10)
lsum ++ ;
sum[i+1] += sum[i] / 10 ;
sum[i] %= 10 ;
}
return lsum ; /*返回積的位數*/
}
int main(void)
{
int a[MAX]={0},b[MAX]={0},sum[MAX*2]={0} ;
int la=0,lb=0,lsum=0;
int i,j ;
char sa[MAX],sb[MAX] ;
scanf("%s %s",sa,sb);
printf("%s * %s = ",sa,sb);
la = strlen(sa);
lb = strlen(sb);
for(i=1,j=la-1; i<= la ; i++,j--)
a[i] = sa[j] - '告桐辯0' ;
for(i=1,j=lb-1; i<= lb ; i++,j--)
b[i] = sb[j] - '0' ;
lsum = bigchenfa(sum,a,b,la,lb) ;
for(i=lsum ; i> 0 ; i--)
printf("%d",sum[i]);
printf(" ");
system("pause");
return 0 ;
}