九度OJ-1003

题目1003:A+B

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:7298

解决:3086

题目描述:
给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。
现在请计算A+B的结果,并以正常形式输出。

输入:
输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)。

输出:
请计算A+B的结果,并以正常形式输出,每组数据占一行。

样例输入:
-234,567,890 123,456,789
1,234 2,345,678
样例输出:
-111111101
2346912
来源:
2010年浙江大学计算机及软件工程研究生机试真题
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
//#define max(a,b) ((a)>(b)?(a):(b))
void opr1(char* str1,char* str2);
void opr2(char* str1,char* str2);
void opr3(char* str1,char* str2);
int Add(char ch1,int ch2,int c);
void CompareAbs(char *str1,char *str2,int *flag);
int Subtract(char ch1,char ch2,int c);
/*int max(int x, int y)
{
	return ((x>y)?x:y);
}
*/
int main()
{
	char str1[100],str2[100];//存储两个字符串
	freopen("D:\\test/input.txt","r",stdin);//该句若放在变量声明前,则会提示这些变量未定义undeclared identifier
	freopen("D:\\test/output.txt","w",stdout);
//	freopen("/mnt/hgfs/D/test/input.txt","r",stdin);
	while (scanf("%s %s",str1,str2)!=EOF)
	{
		if((str1[0]=='-'&&str2[0]=='-')||(str1[0]!='-'&&str2[0]!='-'))//同号的两个数
		{
			opr1(str1,str2);//两数相加
		}
		else
			opr2(str1,str2);//异号的两数相减
	}
	return 1;
}
//将str1和str2从低位到高位,依次相加,并自动跳过逗号
void opr1(char* str1,char* str2)
{
	int len,len1,len2,i,j,c,BitUp;
	char ch1,ch2,str3[20];
	len1=strlen(str1);
	len2=strlen(str2);
	c=0;
	i=0;
	if (str1[0]=='-')
	{
		len1--;
		len2--;
	}
	len=max(len1,len2);
	for(j=1;j<=len;j++)
	{
		if(j%4==0)//跳过逗号
			continue;
//----------------------------位数少的补0,并且把符号位也替换为0--------------------------------------------
		if (len1-j<0)
		{
			ch1='0';
		}
		else
			ch1=str1[len1-j];
		if (len2-j<0)
		{
			ch2='0';
		}
		else
			ch2=str2[len2-j];
		if (ch1=='-')
		{
			ch1='0';
		}
		if (ch2=='-')
		{
			ch2='0';
		}
//---------------------------------------------------------------------------------------------------------------
		BitUp=Add(ch1,ch2,c);//从低位开始每一位相加
		if (BitUp>9)//有进位
		{
			BitUp-=10;
			c=1;//高位上1
		}
		else
			c=0;
		str3[i++]=(char)(BitUp+'0');//每一位相加的和赋给str3,仍以字符串的形式
	}
//输出两个字符串相加的结果
	if (str1[0]=='-')//如果同为负,则输出负号
	{
		putchar('-');
	}
	if (c==1)//最高位有进位
	{
		putchar('1');
	}
	while (i>0)
	{
		putchar(str3[--i]);//逆向打印字符串str3
	}
	putchar('\n');
}
int Add(char ch1,int ch2,int c)//两个字符以及进位相加
{
	int sum;
	sum=ch1-'0'+ch2-'0'+c;
	return sum;
}
void opr2(char* str1,char* str2)//异号的两数相减
{
	char* str3;
	int flag,flag1,i=0;
	if (str1[0]=='-')//将str1的符号位去掉
	{
		str3=str1;
		flag1=1;
		while(str3[i+1]!='\0')
		{
			str1[i]=str3[i+1];
			i++;
		}	
		str1[i]='\0';
	}
	else//将str2的符号位去掉
	{
		str3=str2;
		flag1=0;
		while(str3[i+1]!='\0')
		{
			str2[i]=str3[i+1];
			i++;
		}	
		str2[i]='\0';
	}
	CompareAbs(str1,str2,&flag);//比较str1和str2绝对值的大小
	if (flag==0)//如果相等
	{
		putchar('0');
		putchar('\n');
	}
	else if (flag>0)//str1大于str2
	{
		if (flag1==1)//str1是负数
		{
			putchar('-');
		}
		opr3(str1,str2);//str1减去str2,并输出
	}
	else
	{
		if (flag1==0)//str2是负数
		{
			putchar('-');
		}
		opr3(str2,str1);//str2减去str1,并输出
	}	
}
void opr3(char*str1,char*str2)
{
	char ch1,ch2,str3[20];
	int len1,len2,len,j,Sub,c,i=0;
	len1=strlen(str1);
	len2=strlen(str2);
	len=len1;
	c=0;
	for(j=1;j<=len;j++)
	{
		if(j%4==0)//跳过逗号
			continue;
		ch1=str1[len1-j];
		if (len2-j<0)//如果str2的位数比str1小,则填'0'
		{
			ch2='0';
		}
		else
		{
			ch2=str2[len2-j];
		}
		Sub=Subtract(ch1,ch2,c);//位依次相减
		if(Sub<0)
		{
			Sub+=10;
			c=1;//高位有借位
		}
		else
			c=0;
		str3[i++]=(char)(Sub+'0');//从低位到高位存入str3
	}
	while (str3[i-1]=='0')
	{
		i--;
	}
	while (i>0)
	{
		putchar(str3[--i]);
	}
		putchar('\n');
}
int Subtract(char ch1,char ch2,int c)//每位依次相减
{
	int ss;
	ss=ch1-ch2-c;
	return ss;
}
void CompareAbs(char *str1,char *str2,int *flag)//比较两个字符串的绝对值的大小
{
	int len1,len2,i;
	len1=strlen(str1);
	len2=strlen(str2);
	*flag=0;
	if (len1>len2)
	{
		*flag=1;
	}
	else if (len1<len2)
	{
		*flag=-1;
	}
		else
		{
			for (i=0;i<len1;i++)//从高位到低位依次比较
			{
				if (str1[i]==str2[i])
				{
					continue;
				}
				else if (str1[i]>str2[i])
				{
					*flag=1;	
					break;
				}
					else 
					{
						*flag=-1;
						break;
					}
			}
		}
}

我对自己已经超级无语了,动不动就用字符串处理,这题看不少人是用long型整数处理的,比我方便多了,我花了好长时间才做出来,用例都能通过,就是还不能AC,就这么地吧!

路漫漫其修远兮,吾将上下而求索!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值