c语言高精度加法 :输入两个整数a和b输出这两个整数的和a,b不超过100位,我是初学者求写的简单
考虑溢出
#include stdio.h
#include string.h
void main()
{
char a[100],b[100];
int c[101],d,e,i,f=0;
for(i=0;i101;i++)
{
c[i]=0;
}
gets(a);
gets(b);
d=strlen(a);
e=strlen(b);
for(i=0;id;i++)
{
c[i]=a[d-i-1]-48;
}
for(i=0;ie;i++)
{
c[i]+=b[e-i-1]-48;
if(c[i]=10)
{
c[i]-=10;
c[i+1]++;
}
}
for(i=0;i101;i++)
{
if(c[i]!=0)
{
f=i;
}
}
for(i=f;i=0;i–)
printf(“%d”,c[i]);
}
求助:C语言,大整数的加法。可达10^10,000,000位数的。。。
简单的两数相加肯定不行,必须用字符串。下面是我上学的时候编的,不知道能不能用,你看看。
#include
“stdafx.h”
#include
“stdio.h”
#include
“string.h”
#include
“windows.h”
#include
conio.h
//检查合法性
int
check(char
*a)
{
for(int
i=0;istrlen(a);i++)
if(a[i]-‘0’0||a[i]-‘0’9)
return
0;
return
1;
}
//格式化字符串
void
format(char
*a,char
*b)
{
int
i;
int
maxlen=0,minlen=0,lena=0,lenb=0;
maxlen=strlen(a)strlen(b)?strlen(a):strlen(b);
minlen=strlen(a)strlen(b)?strlen(a):strlen(b);
lena=strlen(a);
lenb=strlen(b);
for(i=lena-1;i=0;i–)
{
a[i+maxlen-lena+1]=’0′;
//初始化
a[i+maxlen-lena+1]=a[i];
}
for(i=0;i=maxlen-lena;i++)
a[i]=’0′;
a[maxlen+1]=’\0′;
for(i=lenb-1;i=0;i–)
{
b[i+maxlen-lenb+1]=’0′;
//初始化
b[i+maxlen-lenb+1]=b[i];
}
for(i=0;i=maxlen-lenb;i++)
b[i]=’0′;
b[maxlen+1]=’\0′;
}
//加法
void
add(char
*a,char
*b)
{
int
c=0;
int
d=0;
int
pw=0;
int
i=0;
int
len=0;
format(a,b);
len=strlen(a);
char
buffer[255]={“0”};
for(i=len-1;i=0;i–)
{
c=a[i]-‘0’+b[i]-‘0’;
d=c%10;
pw=c/10;
a[i-1]=a[i-1]+pw;
buffer[i]=d+’0′;
}
buffer[len]=’\0′;
if(buffer[0]==’0′)
printf(“%s\n”,buffer+1);
else
printf(“%s\n”,buffer);
}
//减法
void
sub(char
*a,char
*b)
{
int
i=0;
int
abigger=0;
int
bbigger=0;
format(a,b);
for(i=0;istrlen(a);i++)
{
if(a[i]b[i])
{
abigger=1;break;}
else
if(a[i]b[i])
{
bbigger=1;break;}
}
if(i==strlen(a))
{
printf(“0”);
return;
}
}
//主函数
int
main(int
argc,
char*
argv[])
{
char
num1[256],num2[256];
char
select;
loop:
printf(“请输入数字:\n”);
gets(num2);
gets(num1);
if(check(num1)==0||check(num2)==0)
{
printf(“非法数字!!请检查输入!!!\n”);
return
0;
}
printf(“请选择运算:1:加法
2:减法
3:乘法
4:除法\n”);
select=getchar();
switch(select)
{
case
‘1’:
add(num1,num2);goto
loop;break;
case
‘2’:
sub(num1,num2);goto
loop;break;
}
}
C语言高精度计算,两个1000位以内的正整数相加,以下的程序是我在网上找到的,求大神解答每一行编码意思
其实它大概的思路如下:
计算出两个大数的长度,并记录最大长度
在共同长度内进行计算,分为进位和不进位两种情况
根据长度较大的大数长出的部分粘到结果,再根据进位情况调整
输出结果
其实个人觉得他的思路虽然没有错,但不够清晰,可以进行一定的改进
#include stdio.h
int main() {
char addend1[1001] = {0};
char addend2[1001] = {0};
char result[1001] = {0};
int length1, length2, resultLength;
int carryOver = 0;
int i, mark;
printf(“请输入第一个加数”);
scanf(“%s”, addend1);
printf(“请输入第二个加数”);
scanf(“%s”, addend2);
for (length1 = 0; addend1[length1]; length1++); // 注意是以分号结尾,求出第一个数的长度
length1–; // 因为后面是计算到length1-1,所以要减1
for (length2 = 0; addend2[length2]; length2++); // 求出第二个数的长度
length2–;
resultLength = length1 length2 ? length1 : length2; // 记录最大长度
for (i = 0; i = resultLength; i++) { // 在最大长度内进行计算
if((i = length1) (i = length2)) { // 如果两个数在这个位置都有数
result[resultLength – i] = addend1[length1 – i] – ‘0’ + addend2[length2 – i] + carryOver; // 计算该位的值,为两个加数的值之和再加上进位
if(result[resultLength – i] ‘9’) { // 如果需要进位
carryOver = 1; // 标记有进位,且为1
result[resultLength – i] -= 10; // 减去进1位所需要的10
} else {
carryOver = 0; // 标记无进位
}
} else { // 如果两个数最多只有一个数在这个位置有值,则退出循环
break;
}
}
mark = i; // 记录一个数比另一个数多出的开始位置
if (i = length1) { // 如果是第一个数多出的话,那根据第一个数多出的部分计算
while (i = length1) {
result[resultLength – i] = addend1[length1 – i];
i++;
}
}
if (i = length2) { // 如果是第二个数的话,则根据第二个数计算
while (i = length2) {
result[resultLength – i] = addend2[length2 – i];
i++;
}
}
for(i = mark; carryOver; i++) { // 如果在多出的位置有进位的话,则根据进位一步一步向前进位,直至没有进位为止
result[resultLength – i] += 1;
if (result[resultLength – i] ‘9’) {
result[resultLength – i] -= 10;
} else {
if (i resultLength) {
printf(“1”);
}
break;
}
}
for (i = 0; i = resultLength; i++) { // 输出结果
if (result[i]) {
printf(“%c”, result[i]);
}
}
return 0;
}
欢迎追问,满意请采纳,谢谢
关于C语言 长整型的输出问题!
已然给你改好叻~
代码如下:
#include stdio.h
__int64 a=0,b=0,i=0,n;
int main()
{
while(scanf(“%lld”,n)!=EOF)
{
while(n–)
{
scanf(“%lld%lld”,a,b);
i++;
printf(“case %lld:\n”,i);
if(n!=0) printf(“%lld+%lld=%lld\n\n”,a,b,a+b);
else printf(“%lld+%lld=%lld\n”,a,b,a+b);
}
}
return 1;
}
No,这是高精度加法~~
//————————————————————-
#include stdio.h
#include string.h
#define clear(a) memset(a,0,sizeof(a))
char A[1010],B[1010],Ans[1010];
int La,Lb,Lans,L;
int N;
void Swap(char a,char b)
{
char Temp=a;
a=b;
b=Temp;
}
int Maxx(int x,int y)
{
return xy?x:y;
}
void Turn(int L,char List[])
{
for (int i=1;i=L;i++)
{
List[i]=List[i]-48;
}
for (int i=1;i=L/2;i++)
{
Swap(List[i],List[L-i+1]);
}
}
void Add(char A[],char B[],int L,char C[],int Lc)
{
int K;
char Temp;
clear(C);
for (int i=1;i=L;i++)//求和
{
C[i]=A[i]+B[i];
}
for (int i=1;i=L;i++)//进位
{
K=i-1;Temp=C[i];
C[i]=0;
while (Temp0)
{
K++;
C[K]+=Temp%10;
Temp=Temp/10;
}
}
Lc=Maxx(K,L);
}
void Back(char List[],int L)
{
for (int i=1;i=L;i++)
{
List[i]+=’0′;
}
for (int i=1;i=L/2;i++)
{
Swap(List[i],List[L-i+1]);
}
}
int main(void)
{
freopen(“Data.in”,”r”,stdin);
freopen(“Data.out”,”w”,stdout);
scanf(“%d”,N);
for(int i=1;i=N;i++)
{
clear(A);clear(B);
scanf(“%s%s\n”,A[1],B[1]);
La=strlen(A[1]);
Lb=strlen(B[1]);
Turn(La,A);//翻转,像这样翻转过后。就不许用考虑去掉高位的0了。
Turn(Lb,B);//翻转
L=Maxx(La,Lb);
Add(A,B,L,Ans,Lans);//求和
Back(Ans,Lans);
Back(A,La);
Back(B,Lb);
printf(“Case %d:\n”,i);
printf(“%s + %s = %s\n”,A[1],B[1],Ans[1]);
printf(“\n”);
clear(A);clear(B);clear(Ans);
}
return 0;
}
以后做题要先确认数据范围,切记切记~~~~~
C语言中如何提高整形数的精度
你可以建立一个数组 每一个元素存储 你的数据的一位 这样原则是可以表示无限大或者无限小的数了 比如做除法运算 可以按照小学时候老师教我们的竖式运算一位一位的往下算然后 存储每以位 要注意的仅仅是小数点在哪两个数之间
c语言中高精度整数转换成低精度整数例子。
C语言做长整型到整型的数据类型转换是直接从低位截取,而将高位舍去。 65536用长整型表示为 十五个0+1+十六个零(二进制) 转换为整型时,取后面十六位二进制数字,结果全是0,所以输出为0. 65535用长整型表示为 十六个0+十六个1(二进制) 转换为整型时,取后面十六位二进制数字,结果全是1,输出为-1(计算机中负数是用补码表示的)
麻烦采纳,谢谢!