當前位置:首頁 » 編程語言 » 大整數乘c語言

大整數乘c語言

發布時間: 2023-03-21 14:24:25

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

*/

❷ 一個大整數相乘的問題 c語言

代碼沒問題,只是a,b,c三個數組用之前沒有清零,C語言系統自動分配內存是不會將內存清零
因此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了

❹ 用分治法怎麼寫大整數乘法的演算法(用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;
}

❺ 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();
}

❻ C語言編程,求用分治法實現大整數乘法

很大的數,只能用字元串,要不然溢出
這個問題有兩個方式解決,一個就是乘法的定義,是乘數的累加
那麼做法就是乘數多次累加,而被乘數每次減去1,直到被乘數為零跳出循枯陵環
那麼這里就需要兩個子函數,一個沒型戚是大數的加法,一個是大數的減去1的演算法

另一個方式,租唯還記得當年小學學過的乘法的豎式嗎?

12 -----(1)

X 12 ------(2)

----------
24 ----(3)

12 ------(4)

---------
144 --------(5)

這樣就轉行為計算(3)(4)等要是多位數,那麼(3)(4)會很多,計算這些的和就是了
最終的到的(5)就是結果
那麼這個問題也是兩個子函數,一個是大數的加法,就是計算(3)(4)等的和
一個是(1)和(2)的每位數的乘法

❼ C語言 大整數乘法 求代碼

#include <stdio.h> #include <string.h>畝培 #define Maxline 300 void main() { void mul(char str1[],char str2[]); char str1[Maxline],str2[Maxline]; scanf("%s%s",str1,str2); mul(str1,str2); } void mul(char str1[],char str2[]) { int i,j,length1,length2,tag; int num1[Maxline],num2[Maxline],num3[Maxline]; length1=strlen(str1); length2=strlen(str2); for(i=0;i<Maxline;i++) { num1[i]=0; num2[i]=0; num3[i]=0; } j=0; for(i=length1-1;i>=0;i--) { num1[j]=str1[i]-'0'; j++; } j=0; for(i=length2-1;i>=0;i--) { num2[j]=str2[i]-'0'; j++; } for(j=0;j<length2;j++) for(i=0;i<length1;i++) { num3[i+j]+=num1[i]*num2[j]; while(num3[i+j]>談塵=10) { num3[i+j]-=10; num3[i+j+1]++; } } for(i=Maxline-1;i>=0;i--) { if(num3[i]!=0) { tag=i; break; } } for(i=tag;i>=0;i--) { printf("%d",num3[i]); } printf("\n"迅侍唯); }

❽ 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;
}

❾ 用c語言編大整數乘法的分析

1,加10是為了防止數據越界伏悉
2,根據乘法的特性來的,乘數和被乘數的笑拆每一個數字缺升乎都相乘,乘數的i位和被乘數的j位是結果的第i+j位
3,求兩個數相乘的結果有多少位。

❿ c語言大整數的乘法

nums[]為指針變數數組
nums[i]=j僅能表示將nums[i]存儲的地址改為了j
若想修改段悉羨其值,握拍需加陸拿*,即*nums[i]=j;
或nums[i]=&j;
你的程序里貌似很多地方這個都弄反了,改正後應該就沒有問題了...

熱點內容
trimsql 發布:2024-03-29 23:29:13 瀏覽:691
編程自學書 發布:2024-03-29 23:29:08 瀏覽:377
qq密碼在qq哪裡能看見 發布:2024-03-29 23:29:06 瀏覽:214
楚雄琪豐酒店wifi密碼多少 發布:2024-03-29 23:20:10 瀏覽:509
自招編程題 發布:2024-03-29 23:19:31 瀏覽:192
蘋果端的什麼游戲與安卓數據互通 發布:2024-03-29 23:18:23 瀏覽:695
androidwear表盤 發布:2024-03-29 23:09:46 瀏覽:833
19萬的紅旗有哪些配置 發布:2024-03-29 23:09:44 瀏覽:985
裝修公司網站源碼 發布:2024-03-29 23:01:45 瀏覽:454
安卓手機哪個有nfc功能 發布:2024-03-29 22:59:25 瀏覽:554