c语言编程,请高人指点!! 100

输入两个整数a,b(a,b的绝对值均要小于10的200次方)输出a+b;a-b;a*b.要求:最后输入a=0,b=0.代表输入结束例如:输入:1001000输出:1109... 输入两个整数a,b(a,b的绝对值均要小于10的200次方)
输出a+b;a-b;a*b.
要求:最后输入a=0,b=0.代表输入结束
例如:输入:100
10
0
0
输出:110
90
1000
单纯用整型变量存储,取值范围是不是太小了,double型存在有效位数的问题啊,输入输出如下:
输入:
200000000000000000
6000000000000000
0
0
输出:
206000000000000000
194000000000000000
1200000000000000000000000000000000
展开
 我来答
百度网友4176d98f3
2006-11-12 · 超过46用户采纳过TA的回答
知道答主
回答量:128
采纳率:0%
帮助的人:0
展开全部
用双精度都不可以!这题其实就是大整数的四则运算问题了!下面给你一个关于大整数四则运算的程序,自己去体会一下吧!
#define MAX 400
void my_read(int *a)
{
int len,i,flag=0;
char s[MAX];
aa:
while(1)
{
scanf("%s",&s);
len=strlen(s);
if (s[0]=='-') flag=1;
for(i=len-flag;i>=1;i--)
{
if ((s[len-i]-'0')<0||(s[len-i]-'0')>9)
{
printf("\t\t\t你输入的第%d位不合法,按任意键重新输!!",len-i+1);
getch();
goto aa;
}
else
a[i]=s[len-i]-'0';
}
if (flag)
a[0]=-(len-1);
else
a[0]=len;
break;
}
return;
}

void my_print(int *a)
{
int i;
if (a[0]<0) printf("-");
if (a[0]==0)
{
printf("0");
return;
}
for(i=abs(a[0]);i>=1;i--)
printf("%d",a[i]);
printf("\n");
}

void format(int *a)
{
int p;
for(p=1;p<a[0]||a[p]>=10;p++)
{
if (p>=a[0]) a[p+1]=0;
a[p+1]+=a[p]/10;
a[p]=a[p]%10;
}
if (p>=a[0]) a[0]=p;
return;
}
void add(int *a,int *b,int *c)
{
int len,i;
if (a[0]<b[0]) len=a[0];
else len=b[0];
for(i=1;i<=len;i++)
c[i]=a[i]+b[i];
if (len<a[0])
{
for (;i<=a[0];i++)
c[i]=a[i];
c[0]=a[0];
}
else
{
for(;i<=b[0];i++)
{
c[i]=b[i];
}
c[0]=b[0];
}
format (c);
}

void commaltiply (int *a,int x,int *b)
{
int i;
for(i=1;i<=a[0];i++)
b[i]=a[i]*x;
b[0]=a[0];
format(b);
return;
}
void matiply(int *a,int *b,int *c)
{
int i,temp[MAX],j;
commaltiply(a,b[1],c);
for(i=2;i<=b[0];i++)
{
if (b[i]==0)
{
c[0]++;
for (j=c[0];j>1;j--)
c[1]=0;
}
else
{
commaltiply(a,b[i],temp);
for(j=1;j<i;j++)
commaltiply(temp,10,temp);
add(c,temp,c);
}
}
}
void dectobin(int *a,int *b)
{
int p;
b[0]=0;
while(a[0]>0)
{
b[0]++;
b[b[0]]=a[1]%2;
p=a[0];
while(p>0)
{
if (a[p]%2 && p>1) a[p-1]+=10;
a[p]/=2;
if (a[a[0]]==0) a[0]--;
p--;
}
}
}

format1(int *a)
{
int i;
for (i=1;i<=a[0];i++)
if (a[i]<0)
{ a[i]+=10;
a[i+1]-=1;
}
}

void sub_1(int *a,int *b,int *c)
{
int i;
for (i=1;i<=b[0];i++)
c[i]=a[i]-b[i];
if (a[0]==b[0]) goto loop;
for (;i<=a[0];i++)
c[i]=a[i];
loop:
c[0]=a[0];
format1(c);
i=c[0];
while(1)
if (c[i]==0) i--;
else break;
c[0]=i;
return;
}

void sub(int *a,int *b,int *c)
{
int i,flag=0;
for (i=1;i<=a[0];i++)
if (a[i]!=b[i]) {flag=1;break;}
if (flag==0)
{
c[0]=0;
return;
}
flag=0;
if (a[0]==b[0])
{
i=a[0];
while(i>0)
{
if (a[i]>b[i])
{
sub_1(a,b,c);
break;
}
if (a[i]<b[i])
{
flag=1;
sub_1(b,a,c);
break;
}
i--;
}
}
if (a[0]>b[0])
sub_1(a,b,c);
else
if (a[0]<b[0])
{
flag=1;
sub_1(b,a,c);
}
if (flag)
c[0]=-c[0];
else
c[0]=c[0];
}
void main()
{
int i,a[MAX],b[MAX],c[MAX];
char yn;
strat:
while(1)
{
clrscr();
printf("\n\n\n");
printf("\t\t\t**************************************\n");
printf("\t\t\t* *\n");
printf("\t\t\t* 1.大整数的加法 *\n");
printf("\t\t\t* 2.大整数的减法 *\n");
printf("\t\t\t* 3.大整数的乘法 *\n");
printf("\t\t\t* 4.大整数进制转换 *\n");
printf("\t\t\t* 5.帮助 ?*\n");
printf("\t\t\t* 6.退出 *\n");
printf("\t\t\t* *\n");
printf("\t\t\t**************************************\n");
printf("\n\n\t\t\t 请选择(1-6):");
yn=getch();
if (yn=='1'||yn=='2'||yn=='3'||yn=='4'||yn=='5'||yn=='6') break;
else
{
printf("\n\t\t\t 输入不合法!按任意键重新输入!!!!"); getch();
}
}
clrscr();
if (yn=='6') return;
if (yn=='4')
{
printf("请输入待转换的大整数:");
printf("\n");
my_read(a);
for (i=1;i<=abs(a[0]);i++)
b[i]=a[i];
b[0]=a[0];
if (a[0]<0) {a[0]=-a[0];dectobin(a,c);a[0]=-a[0];c[0]=-c[0];goto e;}
dectobin(a,c);
e:
printf("十进制:");
my_print(b);
printf("二进制:");
my_print(c);
goto loop;
}
printf("请输入大整数A:");
my_read(a);
printf("请输入大整数B:");
my_read(b);
if (yn=='1')
{
if (a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];add(a,b,c);c[0]=-c[0];a[0]=-a[0];b[0]=-b[0];goto c;}
if (a[0]>0 && b[0]<0) {b[0]=-b[0];sub(a,b,c);b[0]=-b[0];goto c;}
if (a[0]>0 && b[0]>0) {add(a,b,c);goto c;}
if (a[0]<0 && b[0]>0) {a[0]=-a[0];sub(b,a,c);a[0]=-a[0];goto c;}
c:
printf("\n\t\t\t");
printf("A=");
my_print(a);
printf("\n\t\t\t");
printf("B=");
my_print(b);
printf("\n\t\t\t");
printf("C=A+B=");
my_print(c);
goto loop;
}
if (yn=='2')
{
if (a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];sub(b,a,c);a[0]=-a[0];b[0]=-b[0];}
if (a[0]<0 && b[0]>0) {a[0]=-a[0];add(a,b,c);a[0]=-a[0];c[0]=-c[0];}
if (a[0]>0 && b[0]<0) {b[0]=-b[0];add(a,b,c);b[0]=-b[0];}
if (a[0]>0 && b[0]>0) sub(a,b,c);
printf("A=");
my_print(a);
printf("\nB=");
my_print(b);
printf("\nC=A-B=");
my_print(c);
goto loop;
}
if (yn=='3')
{
if (a[0]<0 && b[0]>0) {a[0]=-a[0];matiply(a,b,c);a[0]=-a[0];c[0]=-c[0];goto d;}
if (a[0]>0 && b[0]<0) {b[0]=-b[0];matiply(a,b,c);b[0]=-b[0];c[0]=-c[0];goto d;}
if (a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];matiply(a,b,c);a[0]=-a[0];b[0]=-b[0];goto d;}
matiply(a,b,c);
d:
printf("\n\t\t\tA=");
my_print(a);
printf("\n\t\t\tB=");
my_print(b);
printf("\n\t\t\tC=A*B=");
my_print(c);
goto loop;
}
loop:
while(1)
{
printf("\n\t\t\t继续计算吗?(y/n)");
yn=getch();
if (yn=='y') goto strat;
if (yn=='n') return;
}
}
匿名用户
2006-11-10
展开全部
这题还要“高人”来做?那这世界的高人有点多的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
刚强又独特的彩霞7487
2006-11-10
知道答主
回答量:62
采纳率:0%
帮助的人:40.5万
展开全部
#include<stdio.h>
mian()
{
long int a,b;
while()
{scanf("%d",&a);
scanf("%d",&b);
if(a!==0&&b!==0) break;
printf("%d\n",a+b);
printf("%d\n",a-b);
printf("%d\n",a*b);
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友858fb3d
2006-11-11 · 超过13用户采纳过TA的回答
知道答主
回答量:56
采纳率:0%
帮助的人:33万
展开全部
应该是这样的:
#include<stdio.h>
mian()
{
long int a,b;
while()
{
scanf("%d",&a);
scanf("%d",&b);
if(a!==0&&b!==0) break;
{
printf("%d\n",a+b);
printf("%d\n",a-b);
printf("%d\n",a*b);
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友9ae2d7ce1
2006-11-11 · TA获得超过271个赞
知道小有建树答主
回答量:494
采纳率:0%
帮助的人:0
展开全部
本题绝对值范围在10的200次方之内,所以用长整型也是不行的,而要用双精度型,输入输出要用浮点型并限定小数位
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wangzy2001
2006-11-13 · 贡献了超过363个回答
知道答主
回答量:363
采纳率:0%
帮助的人:0
展开全部
本题绝对值范围在10的200次方之内
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式