![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
c语言问题字符加减操作
#include<string.h>
#define max 1000
/*1. 大整数加法计算两个整数m、n的和,0<=m,n<=10的50次方。
输入输出格式:本题只有1组输入数据,每组数据只有1行,
每组数据包含两个0到10的50次方之间的大整数,两个整数中间用1个空格分隔。
对于每组数据,输出一行,表示两个大整数的和。*/
void nz(char *s)//将字符串逆置
{
int l,temp;
l=strlen(s);
for(int i=0;i<l/2;i++)
{
temp=s[i];s[i]=s[l-i-1];s[l-i-1]=temp;
}
}
void main()
{
char m[max],n[max],*r,*s,h[max+1]={0};
long int a,b;
int i,j,k;
printf("输入两个很大的数!\n");
r=m;s=n;
printf("输入第一个大数!\n");
gets(r);fflush(stdin);
printf("输入第二个大数\n");
gets(s);fflush(stdin);
a=strlen(r);
b=strlen(s);
nz(r);
nz(s);
if(a>b)
{
for(j=b;j<a;j++)
s[j]='0';
/*for(j=0;j<b;j++)
printf("%c",s[j]);*/
for(i=0;i<a;i++)
{
h[i]=r[i]+s[i];
if(h[i]>=10)
{
h[i]=h[i]-10;
h[i+1]=h[i+1]+1;
}
}
}
else if(a<b)
{
for(j=a;j<b;j++)
r[j]='0';
for(i=0;i<b;i++)
{
h[i]=r[i]+s[i];
if(h[i]>=10)
{
h[i]=h[i]-10;
h[i+1]=h[i+1]+1;
}
}
}
puts("\n");
for(k=((a>b)?a:b);k>=0;k--)
{
if(h[k]==0)continue;
else printf("%d",h[k]);
}
}
不知道怎么了,我的思路是先把字符串逆序存放,然后从0开始加,然后把得到的从大开始输出,即结果
求解啊,怎么没人?多谢了 展开
其他的我在调试中,稍等
---------------------------------------------------------------------------------------------------
第一种方法,按字符进行计算:
#define max 1000
/*1. 大整数加法计算两个整数m、n的和,0<=m,n<=10的50次方。
输入输出格式:本题只有1组输入数据,每组数据只有1行,
每组数据包含两个0到10的50次方之间的大整数,两个整数中间用1个空格分隔。
对于每组数据,输出一行,表示两个大整数的和。*/
void nz(char *s)//将字符串逆置
{
int l,temp;
l=strlen(s);
for(int i=0;i<l/2;i++)
{
temp=s[i];s[i]=s[l-i-1];s[l-i-1]=temp;
}
}
void main()
{
char m[max],n[max],*r,*s,h[max+1]={0};
long int a,b;
int i,j,k;
printf("输入两个很大的数!\n");
r=m;s=n;
printf("输入第一个大数!\n");
gets(r);fflush(stdin);
printf("输入第二个大数\n");
gets(s);fflush(stdin);
a=strlen(r);
b=strlen(s);
nz(r);
nz(s);
if(a>b)
{
for(j=b;j<a;j++)
s[j]='0';
/*for(j=0;j<b;j++)
printf("%c",s[j]);*/
for(i=0;i<a;i++)
{
h[i]=r[i]+s[i]-'0'; //字符'i'=i+'0',两个相加会多出一个'0'
if(h[i]>'9')//字符判断>=10的方法是>'9'
{
h[i]=h[i]-10;
h[i+1]=h[i+1]+1;
}
}
}
else if(a<b)
{
for(j=a;j<b;j++)
r[j]='0';
for(i=0;i<b;i++)
{
h[i]=r[i]+s[i]-'0';//字符'i'=i+'0',两个相加会多出一个'0'
if(h[i]>'9') //字符判断>=10的方法是>'9'
{
h[i]=h[i]-10;
h[i+1]=h[i+1]+1;
}
}
}
puts("\n");
for(k=((a>b)?a:b);k>=0;k--)
{
if(h[k]==0)continue;
else printf("%c",h[k]); //输出的是整数
}
}
感激,本人调试不会,如果可以,教我一下调试,vs2010,谢谢
------------------------------------------------------------------------------------------------
方法二:用字符串输入,但是计算时,按照整数计算
#include "StdAfx.h"
#include<stdio.h>
#include<string.h>
#define max 1000
/*1. 大整数加法计算两个整数m、n的和,0<=m,n<=10的50次方。
输入输出格式:本题只有1组输入数据,每组数据只有1行,
每组数据包含两个0到10的50次方之间的大整数,两个整数中间用1个空格分隔。
对于每组数据,输出一行,表示两个大整数的和。*/
void nz(char *s)//将字符串逆置,并将字符串改为整数串,执行之后就不能再用strlen了
{
int l,temp;
l=strlen(s);
for(int i=0;i<l/2;i++)
{
temp=s[i]-'0';s[i]=s[l-i-1]-'0';s[l-i-1]=temp; // 将字符串改为整数串,执行之后就不能再用strlen了
}
}
void main()
{
char m[max],n[max],*r,*s,h[max+1]={0};
long int a,b;
int i,j,k;
printf("输入两个很大的数!\n");
r=m;s=n;
printf("输入第一个大数!\n");
gets(r);fflush(stdin);
printf("输入第二个大数\n");
gets(s);fflush(stdin);
a=strlen(r);
b=strlen(s);
nz(r);
nz(s);
if(a>b)
{
for(j=b;j<a;j++)
s[j]=0; //整形
/*for(j=0;j<b;j++)
printf("%c",s[j]);*/
for(i=0;i<a;i++)
{
h[i]=r[i]+s[i];
if(h[i]>=10)
{
h[i]=h[i]-10;
h[i+1]=h[i+1]+1;
}
}
}
else if(a<b)
{
for(j=a;j<b;j++)
r[j]=0;//整形
for(i=0;i<b;i++)
{
h[i]=r[i]+s[i];
if(h[i]>=10)
{
h[i]=h[i]-10;
h[i+1]=h[i+1]+1;
}
}
}
puts("\n");
for(k=((a>b)?a:b);k>=0;k--)
{
if(h[k]==0)continue;
else printf("%d",h[k]);
}
}
这个输出是错的,正确的应该是:12345700
继续调试
-------------------------------------------------------------------------------
还需要完善两个地方:
h[i]=r[i]+s[i]+h[i];//这里可能有进位(两处都要修改)
// if(h[k]==0)continue; //不能简单的跳过0
// else
printf("%d",h[k]);
自定义函数
void nz(char *s)//将字符串逆置
{
int l,temp;
l=strlen(s);
for(int i=0;i<l/2;i++)
{
temp=s[i];s[i]=s[l-i-1];s[l-i-1]=temp;
}
}
你忽略了改字符数组个数的奇偶问题了
我的如下稍有改动
void nz(char *s)//将字符串逆置
{
int l,i,j;
char temp,ch;
l=strlen(s);
if(l%2==1) //如果l是奇数的话
for(int i=0;i<l/2;i++)
{
{temp=s[i];s[i]=s[l-i-1];s[l-i-1]=temp;}
}
if(l%2==0)
for(i=0;i==j;i++)
{
j=l;
temp=s[i];
s[i]=s[j];
s[j]=temp;
j++;
}
}
希望对你有所帮助!
好像不用管,你可以试试!可是我的代码不知道怎么错了,求解啊。真没辙了
h[i]=s[i]+r[i],应该改写为:h[i]=s[i]+r[i]-'0';还有、满十进一那最好写成加一个常数c=1;还有最后一点:最后的输出应该写成,printf("%c",h[k-1]);把我说的这些改了就ok了。我已经改好了,祝你成功!
广告 您可能关注的内容 |