九度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,就这么地吧!

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

数据中心机房是现代信息技术的核心设施,它承载着企业的重要数据和服务,因此,其基础设计与规划至关重要。在制定这样的方案时,需要考虑的因素繁多,包括但不限于以下几点: 1. **容量规划**:必须根据业务需求预测未来几年的数据处理和存储需求,合理规划机房的规模和设备容量。这涉及到服务器的数量、存储设备的容量以及网络带宽的需求等。 2. **电力供应**:数据中心是能源消耗大户,因此电力供应设计是关键。要考虑不间断电源(UPS)、备用发电机的容量,以及高效节能的电力分配系统,确保电力的稳定供应并降低能耗。 3. **冷却系统**:由于设备密集运行,散热问题不容忽视。合理的空调布局和冷却系统设计可以有效控制机房温度,避免设备过热引发故障。 4. **物理安全**:包括防火、防盗、防震、防潮等措施。需要设计防火分区、安装烟雾探测和自动灭火系统,设置访问控制系统,确保只有授权人员能进入。 5. **网络架构**:规划高速、稳定、冗余的网络架构,考虑使用光纤、以太网等技术,构建层次化网络,保证数据传输的高效性和安全性。 6. **运维管理**:设计易于管理和维护的IT基础设施,例如模块化设计便于扩展,集中监控系统可以实时查看设备状态,及时发现并解决问题。 7. **绿色数据中心**:随着环保意识的提升,绿色数据中心成为趋势。采用节能设备,利用自然冷源,以及优化能源管理策略,实现低能耗和低碳排放。 8. **灾难恢复**:考虑备份和恢复策略,建立异地灾备中心,确保在主数据中心发生故障时,业务能够快速恢复。 9. **法规遵从**:需遵循国家和地区的相关法律法规,如信息安全、数据保护和环境保护等,确保数据中心的合法运营。 10. **扩展性**:设计时应考虑到未来的业务发展和技术进步,保证机房有充足的扩展空间和升级能力。 技术创新在数据中心机房基础设计及规划方案中扮演了重要角色。例如,采用虚拟化技术可以提高硬件资源利用率,软件定义网络(SDN)提供更灵活的网络管理,人工智能和机器学习则有助于优化能源管理和故障预测。 总结来说,一个完整且高效的数据中心机房设计及规划方案,不仅需要满足当前的技术需求和业务目标,还需要具备前瞻性和可持续性,以适应快速变化的IT环境和未来可能的技术革新。同时,也要注重经济效益,平衡投资成本与长期运营成本,实现数据中心的高效、安全和绿色运行。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值