当前位置:首页 » 编程语言 » 大整数乘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;
你的程序里貌似很多地方这个都弄反了,改正后应该就没有问题了...

热点内容
可以上传球球的照片 发布:2024-11-05 15:42:59 浏览:738
拉箱怎么改密码 发布:2024-11-05 15:38:02 浏览:862
http怎么配置 发布:2024-11-05 15:02:45 浏览:461
12级缓存 发布:2024-11-05 14:52:09 浏览:578
神武4脚本 发布:2024-11-05 14:48:50 浏览:702
王者荣耀反复解压 发布:2024-11-05 14:31:58 浏览:853
存储引擎有哪些品牌 发布:2024-11-05 14:25:59 浏览:39
红薯的存储方法 发布:2024-11-05 14:17:32 浏览:757
脚本错误弹窗口在哪里 发布:2024-11-05 14:01:16 浏览:967
java微信demo 发布:2024-11-05 13:50:31 浏览:238