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

c语言高精度加法程序

发布时间: 2023-05-15 03:18:02

⑴ 关于用c语言编写高精度加减法

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

⑵ 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语言高精度加法

首先,你的进位没有处理好,就是最后那个循环,其次,你这样把字符数组转换成整型数组没有提高程序的运行效率,反而降低了,滑冲要么就直接用字符数衡旦组进行操作信拦歼,或者可以每四个字符数字转换成一个整型数据。(ps,我也不是很厉害,如果有什么不对,请指正)

⑷ 求高精度的整数加法(C语言)

/*本程序用字符串的形式实现两个长"整数"进行相加后所得的数,考虑到连续性
输入,所以用了字符串.
缺点:引用某一位的弊早值为非整数,要将其-48(acsii字符0的值)才得到其整数值
优点:可以连续性输入两个数的值
*/

#include "stdio.h"
#include "string.h"
#include "conio.h"
#define MaxSize 100
/*设置数组最大范围的位数*/

int i; /*定义全局变量i*/
char *add(char *data1,char *data2)
{
char *buff=(char*)malloc(MaxSize+2); /*申请一个存放两数组相加后的空间*/
int top1,top2,temp_top;
for(i=0;i<MaxSize+2;i++)
buff[i]=0; /*初始化空间,使之都为0*/
top1=strlen(data1);
top2=strlen(data2);
temp_top=top1<top2?top1:top2; /*判断1数组和2数组的长度,并把小的赋值给temp_top*/
for(i=0;temp_top>0;i++,temp_top--)
{
if(buff[i]+data1[top1-i-1]+data2[top2-i-1]-96>=10) /*判断个(十,百……)位相加是否要进位*/
{
buff[i]=(buff[i]+data1[top1-i-1]+data2[top2-i-1]-96)%10+48;
buff[i+1]=1;
}
else buff[i]+=data1[top1-i-1]+data2[top2-i-1]-48;
}
if(top1>top2) /*判断第一个长整数长度是否大于岁备第二个长整数长度*/
{
temp_top=top1-top2;
for(;temp_top>0;temp_top--,i++) /*两数组相加后,第一个数组还有剩余的数就依次存在buff指向的空间中,
并且要判断两数组最后次相加是否需要进位*/
{
if(buff[i]+data1[temp_top-1]==58)
{
buff[i]='0';
buff[i+1]=1;
}
else buff[i]+=data1[temp_top-1];
}
}
else /*判断第二个长乎卜毁整数长度是否大于第一个数组的长度*/
{
temp_top=top2-top1;
for(;temp_top>0;temp_top--,i++)
{
if(buff[i]+data2[temp_top-1]==58)
{
buff[i]='0';
buff[i+1]=1;
}
else buff[i]+=data2[temp_top-1];
}
}
if(buff[i]==1) /*如果最高位是进位得来,则加上48换成acsii码*/
buff[i]='1';
return buff; /*返回buff所指向的空间的指针*/
}

main()
{
char *add_data;
char data_1[MaxSize],data_2[MaxSize];
printf("Please input first long number:");
gets(data_1);
printf("Please input second long number:");
gets(data_2);
add_data=add(data_1,data_2);
printf("%s\n+\n%s\n=",data_1,data_2);
for(;i>=0;i--)
printf("%c",add_data[i]); /*倒序输出buff里的内容*/
getch();
}

⑸ C语言高精度加法

st3[82]=st2[82];st2[82]=st1[82];st1[82]=st3[82];}

⑹ 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语言程序(有关高精度加减法)

/*********************
程序功能:计算任意位两整数相减
这里我为了程序的可管理性(也就是可维护性)
用了把程序分成了好几块,
当然对我来说这并不算多。这样的程序
更符合软件工程的要求或说对做比较大的程序较好
虽然这么多还是不够的,但是怕多了你会觉得太过复杂
请耐心读完,或直接上机器看结果。
当然对于有小数的也可以写,但是那样代码多得多。
******************/
#define LEN 250
#include <stdio.h>
#include <string.h>
/*A、B异号*/
int subA(char cha[], char chb[], char chc[])
{
int j = 0;
int tem = 0;
int flag = 0;
int a;
int b;
int fa = 0;
int fb = 0;
int lena = strlen(cha) - 1;
int lenb = strlen(chb) - 1;
char ch;
printf("not the same\n");
if ('-' == cha[0])
{
ch = '-';
fb = -1;
}
else
{
fa = -1;
ch = '+';
}
for (; lena > fa && lenb > fb; lena--, lenb--)
{
tem = (cha[lena] - '0') + (chb[lenb] - '0') + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
j++;
}
if (lena > fa)
{
for (; lena >纤旅 fa; lena--, j++)
{
tem = cha[lena] - '0'差竖厅 + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
}
}
else if (lenb > fb)
{
for (; lenb > fb; lenb--, j++)
{
tem = chb[lenb] - '0' + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
}
}
if (flag)
{
chc[j] = flag + '0';
j++;
}
chc[j] = ch;
j++;
return j;
}

/*比较函数*/
/****写这函数是因虚隐为发现用系统比较strcmp()出问题,具体在哪我也没去查
我当然也知道系统的会返回一些正负或0值,但是我这里测有时候对有时候错****/
int AcmpB(char cha[], char chb[])
{
int i;
int j;
int lena;
int lenb;
lena = strlen(cha);
lenb = strlen(chb);
if (lena > lenb)
{
return 1;
}
else if (lena < lenb)
{
return -1;
}
else
{
for (i = 0; i < lena; i++)
{
if (cha[i] < chb[i])
{
return -1;
}
else if (cha[i] > chb[i])
{
return 1;
}
}
}
}

/*A、B同号*/
int subB(char cha[], char chb[], char chc[])
{
int i;
int j = 0;
int f;
int tem;
int tema;
int temb;
int lena;
int lenb;
int count = 0;
int temflag;
char ch;
char chtem[LEN];
if ('-' == cha[0])
{
ch = '-';
f = 0;
}
else
{
f = -1;
ch = '+';
}
temflag = AcmpB(cha, chb);
/*调整长度*/
if (temflag < 0)
{
strcpy(chtem, cha);
strcpy(cha, chb);
strcpy(chb, chtem);
/*判断正负*/
if ('-' == ch)
{
f = 0;
ch = '+';
}
else
{
f = -1;
ch = '-';
}
}
lena = strlen(cha) - 1;
lenb = strlen(chb) - 1;
for (; lenb > f; lenb--, lena--)
{
tema = cha[lena];
temb = chb[lenb];
if (tema < temb)
{
for (i = lena - 1; i > f; i--)
{
if ('0' != cha[i])
{
cha[i] = ((cha[i] - '0') - 1) + '0';
break;
}
else
{
count++;
}
}
if (count)
{
for (i++; i <= lena - 1 && count > 0; i++, count--)
{
cha[i] = '9';
}
}

tema += 10;
}
tem = tema - temb;
chc[j] = tem + '0';
j++;
}
/**退出循环有可能A还有数据**/
for (;lena > f; lena--)
{
chc[j] = cha[lena];
j++;
}
chc[j] = ch;
j++;
chc[j] = '\0';
return j;
}

/*判断输入的是否为合法数据,为程序健壮性设计,可不要。
但要保证你输入的是合法的,这是我规定的,合法返回1否则返回0
注意:这里判断的标准为正数不带符号,负数带减号且正数不能以0打头
负数也不能写成如-0123,而是写成-123否则将造成后面的大改AcmpB比较出错*/
int isringht(char ch[])
{
int i;
int len = strlen(ch);
/***这个if是防止输入如-0123类似数据****/
if ('-' == ch[0] && '0' == ch[1])
{
return 0;
}
if ('-' == ch[0] || '0' < ch[0] && ch[0] <= '9')
{
for (i = 1; i < len; i++)
{
if (ch[i] > '9' || ch[i] < '0')
{
return 0;
}
}
if (len == i)
{
return 1;
}
}
else
{
return 0;
}
}
/*输入函数这里规定如果输入不合法(含有非数字,除了符号位)
时,重输入,直到正确,当然还可以设别的出口,如果再加别的可能这程序会过大*/
void input(char ch[])
{
int flag = 1;
while (flag)
{
printf("Input the numbers:\n");
gets(ch);
if (!isringht(ch))
{
printf("Input error !\nplease re_input:\n");
}
else
{
flag = 0;
}
}
}
/*输出结果*/
void print(char ch[], int n)
{
int i;
int count = 0;
int flag = 1;
/*如果结果为零则直接输出一个0,而不是输出一串0*/
for (i = 0; i < n - 1; i++)
{
if ('0' != ch[i])
{
break;
}
}
if (i == n - 1)
{
printf("0");
return;
}
/****修正输出,比如当有-0003时只输出-3,正数也类似*****/
for (i = n - 2 - count; i >= 0; i--)
{
if ('0' == ch[i] && 1 == flag)
{
count++;
}
else
{
flag = 0;
break;
}
}
if ('+' == ch[n-1])
{
for (i = n - 2 - count; i >=0; i--)
printf("%c", ch[i]);
}
else
{
for (i = n - 1; i >= 0; i--)
{
printf("%c", ch[i]);
}
}
}

void main()
{
int i;
int len;
char ch;
char cha[LEN];
char chb[LEN];
char chresult[LEN + 1];/*结果可能有进位,如负数减正数*/

for (i = 0; i < LEN; i++) /*初始化存放结果的数组,以保证结果的正确性*/
{
chresult[i] = '0';
}
chresult[i] = '\0';/*字符串结束标志,本这不用多说*/

input(cha);
printf("the first number is: ");
puts(cha);
input(chb);
printf("the second number is: ");
puts(chb);
if ('-' == cha[0] && '-' != chb[0]|| '-' != cha[0] && '-' == chb[0])
{
ch = 'A';/*A、B异号*/
}
else
{
ch = 'B';/*A、B同号*/
}
switch(ch)
{
case 'A':
{
len = subA(cha, chb, chresult);
break;
}
case 'B':
{
len = subB(cha, chb, chresult);
break;
}
/* default:printf("*********"); */
}

printf("(first number sub second number)result is :\n");
print(chresult, len);
/*puts(chresult);
让程序到此停顿*/
getch();
}/***由于时间有限没有进行那么全面的测试,如果发现有什么漏处请给出指示
这样的代码你认为没有水平我也没办法了.等以后有提高再再次改进吧,现在能缩的只能这样了,不过一定能再缩的,不过那样会费更多的心思,要想出更好的算法**/

⑻ C语言计算高精度加法

if(n==1)
有点问题,因为你没有给n赋初值,所以n的值不确定,也就是说可能为1,那该if语句就失效了。
另外,其实根本就没必要事先比较s1和s2的长度,模仿递增向量的合并方法,先计算长度相同的部分,之后计算剩余部分。
我用c++的string字符串写了一个,你参考下。
#include<iostream>
#include<string>
using
namespace
std;
void
Reverse(string
&
str);
void
AddInt(string
&
c,
string
a,
string
b);
int
main()
{
string
a,
b,
c;
cin
>>
a
>>
b;
AddInt(c,
a,
b);
cout
<<
a
<<
"
+
";
cout
<<
b
<<
"
=
"
<<
endl;
cout
<<
c
<<
endl;
system("pause");
return
0;
}
void
Reverse(string
&
str)
{
int
left,
right;
left
=
0;
right
=
str.size()-1;
while
(left
<
right)
{
char
ch
=
str[left];
str[left]
=
str[right];
str[right]
=
ch;
left++;
right--;
}
}
void
AddInt(string
&
c,
string
a,
string
b)//模仿递增向量的合并方法
{
c.resize(0);
Reverse(a);
Reverse(b);
//逆序计算a+b,则从低位开始计算
int
i,
carry;
i
=
carry
=
0;
while
(i
<
a.size()
&&
i
<
b.size())
{
c
+=
(a[i]-'0'
+
b[i]-'0'
+
carry)
%
10
+
'0';
carry
=
(a[i]-'0'
+
b[i]-'0'
+
carry)
/
10;
i++;
}
while
(i
<
a.size())
{
c
+=
(a[i]-'0'
+
carry)
%
10
+
'0';
carry
=
(a[i]-'0'
+
carry)
/
10;
i++;
}
while
(i
<
b.size())
{
c
+=
(b[i]-'0'
+
carry)
%
10
+
'0';
carry
=
(b[i]-'0'
+
carry)
/
10;
i++;
}
while
(carry
>
0)//计算进位部分
{
c
+=
carry
%
10
+
'0';
carry
/=
10;
}
i
=
c.size()
-
1;
while
(c[i]
==
'0')//消除多余的高位0
{
i--;
}
c
=
c.substr(0,
i+1);
Reverse(c);
}

⑼ 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语言高精度加法

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