数学题-大数据的相加和相加(HDOJ1002(相加)(HDOJ 1042(相乘)

1:HDOJ1002

题目大意:给定两个整数(整数位数都小于1000) 精算两个数的和。并按要求格式输出。

解体思路:使用char数据接收数据,并按位计算两个数的和,保存在c数组中。

容易出现的问题:刚开始思路是有的,但是写代码的时候犯混了总以为 char[0] 是个位,而char的最高位是整数的最高位,这样写完测试用例可以通过,

但是 当输入 99999 和1 的时候就会输出错误。 正确思路是:char数组的最后一位是个位,char[0] 是输入整数的最高位。此外输出格式也有特殊要求,每个case中间需要输出一个额外的空行,而最后一个case则不需要,所以需要用一个if语句判断一下。

代码如下:

//Time:15MS
//Mem :364K

#include <string.h>
#include <iostream>

using namespace std;

int main()
{
	char a[1001];
	char b[1001];
	char c[1001];
	int t;
	cin>>t;
	for(int i=1;i<=t;i++)
	{
		cin>>a>>b;
		int rest = 0;
		int len =0;
		int lena = strlen(a)-1;
		int lenb = strlen(b)-1;
		for(;lena>=0||lenb>=0;lena--,lenb--)
		{
			if(lena>=0)
				rest += a[lena]-'0';
			if(lenb>=0)
				rest += b[lenb]-'0';
			c[len++] = rest%10 + '0';
		
			rest = rest/10;
		}

		cout<<"Case "<<i<<":"<<endl;
		cout<<a<<" + "<<b<<" = ";

		if(rest != 0)
			cout<<(char)(rest+'0');
		c[len]='\0';
		for(int j=len-1;j>=0;j--)
			cout<<c[j];
		cout<<endl;
		if(i != t)
			cout<<endl;


	}
	return 0;
}

2:HD1042

题目大意:给定一个数N(1=<N<=10000)计算N的阶乘,跟POJ1001的思路是一样的。

遇到的问题:数组至少得开辟4W大小要不就会WA掉,而且按照这种做法时间会在2.5S以上,在statistic版看到一个用gcc提交的只需要109MS.后来对我的代码也做一下优化,但是还是找少得2S多。


代码如下(待优化):

//Time:2073MS
//Mem :500K

#include <iostream>
#include <string.h>


using namespace std;

#define SIZE 30000

int main()
{
	int n;
	int ans[SIZE];
	while(cin>>n)
	{
		memset(ans,0,sizeof(ans));
		
		int temp = n;
		int len = 0;
		
		ans[0] =1;	
		int rest = 0;
		for(int i=2;i<=n;i++)
		{
		 	for(int j=0;j<SIZE;j++)
			{
				ans[j] = ans[j]*i + rest;
				rest = ans[j]/10;
				ans[j] = ans[j]%10;
			}
		}
		for(int i=SIZE-1;i>=0;i--)
			if(ans[i]==0)
				continue;
			else
			{
				len = i;
				break;
			}
		for(int i=len;i>=0;i--)
			cout<<ans[i];
		cout<<endl;

	}
	return 0;
}










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章