当前位置:首页 » 编程语言 » c语言高精度加法

c语言高精度加法

发布时间: 2022-03-04 08:51:12

c语言编程 高精度加减法

等十分钟
在给你写
加法函数
好久没写程序了
本来以为十分钟能写好
。。。。。(修改:修复了个小bug)
void
plus(char
*a,
char
*b,
char
*c){
int
i,index_a,index_b,index_c,carry=0,ten='9'+1,temp_index_c;
index_a=strlen(a)-1;
//
index变量指向最末一个数字
index_b=strlen(b)-1;
index_c=index_a>index_b?
index_a:index_b;
temp_index_c=index_c;
if(index_a>=index_b){
for(i=index_b+1;i>=0;i--){
b[i+(index_a-index_b)]=b[i];
}
for(i=0;i<index_a-index_b;i++)
b[i]='0';
}
else{
for(i=index_a+1;i>=0;i--){
a[i+(index_b-index_a)]=a[i];
}
for(i=0;i<index_b-index_a;i++)
a[i]='0';
}
while(index_c>=0){
c[index_c]=a[index_c]+b[index_c]+carry-'0';
if(c[index_c]>=ten){
c[index_c]-=ten-'0';
carry=1;
}
else
carry=0;
index_c--;
}
if(carry==1){
for(i=temp_index_c;i>0;i--){
c[i+1]=c[i];
}
c[0]=1;
}
c[temp_index_c+1]=0;
}

② C语言高精度加法

所谓高精度加法一般都是把数字存成字符型,然后按照加法规则一位一位的加并进位。我做过长整数的,基本上位数没什么限制。如果带小数的话需要处理一下,稍微麻烦一些

③ C语言高精度实数加法

#include<stdio.h>
void main()
{
double m,n,sum;
printf("请输入数据m:\n");
scanf("%lf",&m);
printf("\n");
printf("请输入数据n:\n");
scanf("%lf",&n);
sum=m+n;
printf("%.2lf\n",sum);
}

④ C语言80位数高精度加法

整个思路就是错误的,getchhar()读到的数字都被忽略了,所以只有2,4,6....位的数字参加运算

正确的思路应该是以字符串形式读入,然后分离各个数字到数组里,最后相加输出

⑤ c语言~~高精度加法~~

编个大数类。下面是我编过一个不成熟的,可以运行加减乘:
#include<iostream>
using namespace std;
class big
{
public:
big()
{
high=1;
num[0]=1;
int n;
for(n=1;n<40;n++)
{
num[n]=0;
}
}
big(int hi)
{
high=hi-1;
num[0]=1;
int n;
for(n=1;n<40;n++)
{
num[n]=0;
}
}
bool operator >(big &b2);
big operator +(big &b2);
big operator -(big &b2);
big operator *(big &b2);
void output();
void input();
big muln(int a);
private:
long num[40];
int high;
};
bool big::operator >(big &b2)
{
if(high>b2.high)return true;
if(high<b2.high)return false;
else
{
int i;
for(i=high;i>=0;i--)
if(num[i]>b2.num[i])return true;
return false;
}
}
big big::operator +(big &b2)
{
int maxhigh;
maxhigh=(high>b2.high)?high:b2.high;
big b(maxhigh+1);
int i;
for(i=maxhigh;i>=0;i--)
b.num[i]=num[i]+b2.num[i];

for(i=0;i<40;i++)
{
if(b.num[i]/10!=0)
{
b.num[i+1]+=b.num[i]/10;
b.num[i]=b.num[i]%10;
if(b.high<i+1)
b.high=i+1;
}
}
return b;
}
big big::operator -(big &b2)
{
big b;
int i;
if(*this>b2)
{
b.high=high;
for(i=high;i>=0;i--)
b.num[i]=num[i]-b2.num[i];
for(i=0;i<=b.high;i++)
{
if(b.num[i]<0)
{
b.num[i+1]--;
b.num[i]=b.num[i]+10;
}
}
if(b.num[high]==0)
b.high--;
}
if(b2>*this)
{
b.high=b2.high;
for(i=high;i>=0;i--)
b.num[i]=b2.num[i]-num[i];
for(i=0;i<=b.high;i++)
{
if(b.num[i]<0)
{
b.num[i+1]--;
b.num[i]=b.num[i]+10;
}
}
if(b.num[high]==0)
b.high--;
b.num[high]=-b.num[high];
}
return b;
}

big big::operator *(big &b2)
{
big b(high+b2.high),c(high+b2.high);
int i;
for(i=0;i<=high;i++)
{
int n;
c=b2.muln(num[i]);
for(n=1;n<=i;n++)
c=c.muln(10);
b=b+c;
}
b.num[0]--;
for(i=0;i<40;i++)
{
if(b.num[i]/10!=0)
{
b.num[i+1]+=b.num[i]/10;
b.num[i]=b.num[i]%10;
if(b.high<i+1)
b.high=i+1;
}
}
return b;
}
big big::muln(int a)
{
int i;
big b;
b.high=high;
for(i=0;i<=b.high;i++)
b.num[i]=num[i]*a;
for(i=0;i<40;i++)
{
if(b.num[i]/10!=0)
{
b.num[i+1]+=b.num[i]/10;
b.num[i]=b.num[i]%10;
if(b.high<i+1)
b.high=i+1;
}
}
return b;
}
void big::output()
{
int i;
for(i=high;i>=0;i--)
cout<<num[i];
}
void big::input()
{
int i;
char chr[40];
for(i=high;i>=0;i--)
{
cin>>chr[i];
num[i]=chr[i]-'0';
}
}
int main()
{
int n1,n2;
char c='y',*c1,*c2;
while(c=='y'||c=='Y')
{
cout<<"输入第一个大数位数:";
cin>>n1;
big b1(n1);
cout<<endl<<"输入第一个大数:"<<endl;
b1.input();
cout<<"选择操作:"<<endl<<"1.加法"<<endl<<"2.减法"<<endl<<"3.乘法"<<endl;
int choice;
cin>>choice;
cout<<"输入第二个大数位数:";
cin>>n2;
big b2(n2);
cout<<endl<<"输入第二个大数:"<<endl;
b2.input();
big b3;
switch(choice)
{
case 1:b3=b1+b2;break;
case 2:b3=b1-b2;break;
case 3:b3=b1*b2;break;
}
b3.output();
cout<<endl<<"再来一次?Y(是)/ N(否)"<<endl;
cin>>c;
}
system("pause");
return 0;
}

⑥ c语言高精度加法 求改错

注意一下,数组下标从0开始,最大下标取值是数组大小-1

这里不用atoi,直接用对应位置的值-'0'

输入字符串数组不用取地址

剩下的还需要微调:改动部分注释给出

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
inta1[100],b1[100],c[101];
intk1,k2,l,k;
voidadd(inta2[100],intb2[100])
{
inty=0;
inth,x;
for(h=99;h>=k;h--)////////////////////////////
{
x=a2[h]+b2[h]+y;
c[h]=x%10;
y=x/10;
}
if(y!=0)
{
k--;
c[k]=y;
}
for(h=k;h<=99;h++)
printf("%d",c[h]);
printf(" ");////////////////////
}
intmain()
{
intn,i,j;
chara[100],b[100];
scanf("%d",&n);
for(i=1;i<=n;i++)
{

scanf("%s%s",a,b);////////////////////////
printf("Case%d: ",i);
for(j=0;j<100;j++)a1[j]=0;///////////////
for(j=0;j<100;j++)b1[j]=0;////////////////
for(j=0;j<101;j++)c[j]=0;//////////////
k1=99;/////////////////
l=strlen(a);
for(j=l-1;j>=0;j--)///////////////////
{
a1[k1]=a[j]-'0';//////////////////
printf("%c",a[l-j-1]);/////////////////////
k1--;
}//貌似是这个循环求改正
printf("+");
k1++;
k2=99;//////////////////////
l=strlen(b);
for(j=l-1;j>=0;j--)////////////////////
{
b1[k2]=b[j]-'0';/////////////////
printf("%c",b[l-j-1]);///////////////////
k2--;
}
k2++;
printf("=");//////////////////
if(k1>k2)k=k2;elsek=k1;///////////////////
add(a1,b1);
}
return0;
}

⑦ 高精度加法的C语言程序

#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>usingnamespacestd;charsa[1000],sb[10000];inta[1000],b[1000],c[1000];intla,lb,lc;intmain(){scanf(%s%s,sa,sb);la=strlen(sa);lb=strlen(sb);memset(a,0,sizeof(a));memset(b,0,sizeof(b));for(inti=0;i<la;i++)a[la-i-1]=sa[i]-'0';for(inti=0;i<lb;i++)b[lb-i-1]=sb[i]-'0';lc=la>lb?la:lb;//if(la>lb)lc=la;elselc=lb;memset(c,0,sizeof(c));for(inti=0;i<lc;i++){c[i]=a[i]+b[i]+c[i];if(c[i]>=10){c[i+1]=1;c[i]-=10;}}if(c[lc]>0)lc++;for(inti=lc-1;i>=0;i--)printf(%d,c[i]);return0;}#include<stdio.h>#include<string.h>intmain(){chara[10001],b[10001];inta1[10001]={0},b1[10001]={0},s[20002]={0};intlena,lenb;inti,j,k=0,t;scanf(%s%s,&a,&b);lena=strlen(a);lenb=strlen(b);for(i=0;i<lena;i++)a1[i]=a[i]-48;for(j=0;j<lenb;j++)b1[j]=b[j]-48;while(i>=0&&j>=0){s[k]=a1[i]+b1[j];k++;i--;j--;}if(i>=0)while(i>=0){s[k]=a1[i];k++;i--;}elseif(j>=0)while(j>=0){s[k]=b1[j];k++;j--;}for(t=1;t<k;t++)if(s[t]>=10){s[t]%=10;s[t+1]++;}while(s[k]==0)k--;for(t=k;t>0;t--)printf(%d,s[t]);return0;}

⑧ c语言问题 计算高精度加法

#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MaxLen 256
void myadd( char* p, int n )
{
int t;
if( (*p) != '\0' ) t = (*p)-'0';
else t=0;
t = t + n;
if( t>=10 )
{
myadd( p+1, t/10 );
}
*p = t%10 + '0';
}

main()
{
char s[MaxLen] = {0};
char a[MaxLen] = {0};
char b[MaxLen] = {0};

printf( "输入第一个数字\n" );
scanf( "%s",a );
printf( "输入第二个数字\n" );
scanf( "%s",b );

int lena = strlen(a);
int lenb = strlen(b);

int len = (lena>=lenb?lenb:lena);
int i;
for( i=0;i<len;i++ )
{
int t = (a[lena-1-i]-'0') + (b[lenb-1-i]-'0');
myadd( &s[i], t );
}
if( lena>lenb )
{
for( ;i<lena;i++ )
{
int t = (a[lena-1-i]-'0');
myadd( &s[i], t );
}
}
else if( lenb>lena )
{
for( ;i<lenb;i++ )
{
int t = (b[lenb-1-i]-'0');
myadd( &s[i], t );
}
}
len = strlen(s);
for( int i1=0;i1<len/2;i1++ )
{
char ch = s[i1];
s[i1] = s[len-1-i1];
s[len-1-i1] = ch;
}

printf( "\n" );
printf( "%s\n",s );
getch();

}

⑨ C语言的高精度加法

#include<iostream>#include<string.h>using namespace std;
int main(){ char a1[1000],b1[1000]; int a2[1000],b2[1000],c[1001],len1,len2,i,j,k,t; while(cin>>a1>>b1) { len1=strlen(a1); len2=strlen(b1);
memset(a2,0,sizeof(a2)); memset(b2,0,sizeof(b2)); memset(c,0,sizeof(c));
k=0; for(i=len1-1;i>=0;i--) { a2[i]=a1[k]-48; k++; }
k=0; for(i=len2-1;i>=0;i--) { b2[i]=b1[k]-48; k++; }
j=0; t=(len1>len2)? len1:len2; while(j<t) { c[j]=a2[j]+b2[j]; j++; } for(i=0;i<t;i++) { if(c[i]>9) { c[i]-=10; c[i+1]++; } } if(c[t]!=0) cout<<c[t]; for(i=t-1;i>=0;i--) cout<<c[i]; cout<<endl; } return 0;}

⑩ 关于用C语言编写高精度加减法

好像是哪个oj上的题目,直接模拟就行了,加减法都是从字符串的最后一个字符算起,如果*a + *b > '9'就进位,同时移动指针 a--, b--,c--就行了。

热点内容
第一次安装如何设置mysql密码 发布:2025-01-12 12:09:02 浏览:280
如何删除微信服务器上收藏 发布:2025-01-12 12:08:20 浏览:102
吃鸡游戏安卓区转苹果区怎么转 发布:2025-01-12 11:34:00 浏览:880
网页版c语言 发布:2025-01-12 11:21:01 浏览:864
安卓怎么更改排位常用英雄 发布:2025-01-12 11:10:33 浏览:561
拆迁的100万如何配置 发布:2025-01-12 11:08:52 浏览:575
如何配置ph值为次氯酸钠的ph值 发布:2025-01-12 11:08:52 浏览:437
pythonarraynumpy 发布:2025-01-12 11:01:47 浏览:293
酷我剪辑铃声文件夹 发布:2025-01-12 10:51:59 浏览:683
编译原理龙书第9章 发布:2025-01-12 10:46:53 浏览:155