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;
}