poj 1001 解题报告
1001解题报告:
1、每一次提交前,先核对一下是否真正粘贴了应该粘的正确的程序。
2、在提交前,请把system("PAUSE")或者clock()-start之类测试时间的代码给注释掉。
3、严格按照题目所给的输出格式输出,例如,如果题目要求循环录入,那么谨记,用while(cin>>){}的格式或者其他的只要能够符合循环录入即可。
4、请不要试图把软件工程之类的东西给随意套进来,因为可能会增加问题的规模。造成自己测试的复杂度---(这一条还有待考究啊,毕竟自己才是菜鸟,也只是对软件工程的东西稍微懂一点。)
5、把每一次测试的数据,给保存下来,最好给每一个程序项目都专门建一个测试数据.txt文档。
6、每当拿到一个复杂的问题,不要慌张,先概要设计在详细设计,呵呵,又扯到了软件工程的东西了。不过这一点是应该提倡的---即从抽象到具体,逐步求精。呵呵。
解题代码:
Source Code
Problem: 1001 | User: omycle | |
Memory: 256K | Time: 16MS | |
Language: C++ | Result: Accepted |
- Source Code
#include <iostream>
#include <string.h>
//#include <time.h>
#include <stdlib.h>
using namespace std;
void add(char * a,char * c,int offset)
{
char ab[255];
memset(ab,'\0',sizeof(char)*255);//这一步很有必要
for(unsigned int i_=0;i_<strlen(a);i_++)
ab[i_]=a[strlen(a)-i_-1];
char cd[255];
memset(cd,'\0',sizeof(char)*255);//
for(unsigned int j=0;j<strlen(c);j++)
cd[j]=c[strlen(c)-j-1];
// int offset=0;
int temp_g=0;
int temp_j=0;
int strlen_k=strlen(cd);
//将ab的这个数补全
for(unsigned int i_i=strlen(ab);i_i<strlen(cd)+offset;i_i++)//重要
ab[i_i]='0';
for(unsigned int j_j=strlen(cd);j_j<strlen(ab)+offset;j_j++)//重要
cd[j_j]='0';
int k;
for( k=offset;k<strlen_k+offset;k++)
{
int temp=(ab[k]-'0')+(cd[k-offset]-'0')+temp_j;
temp_j=temp/10;
int temp_g=temp%10;
ab[k]=temp_g+'0';
}
if(temp_j)
ab[k]=temp_j+'0';
else
k--;
// cout<<a<<'+'<<c<<'=';
int i=0;
k=strlen(ab)-1;
while(k>-1)
{
c[i++]=ab[k--];
}
// cout<<c<<endl;
i=0;
while(i<strlen(c))
a[i++]=c[i];//hehe!
// cout<<a;
return ;
}
void mutile(char *chen,char *chened)
{
int i_chened=strlen(chened);
int i_chen=strlen(chen);
//先把两个数翻过来再说!
unsigned int i=0;
char chen_temp[255];
memset(chen_temp,'\0',sizeof(char)*255);
char chened_temp[255];
memset(chened_temp,'\0',sizeof(char)*255);
while(i_chened--)
{
chened_temp[i++]=chened[i_chened];
}
i=0;
while(i_chen--)
{
chen_temp[i++]=chen[i_chen];
}
//----把两个数翻转了过来
//开始乘了!!HOHO!!
i_chened=strlen(chened);
i_chen=strlen(chen);
int offset=0;
char li_[255];
memset(li_,'\0',sizeof(char)*255);
char line[255];
//开始进入正题了!HOHO!
for(i=0;i<i_chened;i++)
{
memset(line,'\0',sizeof(char)*255);
int ii=0;
int temp_j(0);
int temp_l(0);
int j;
for(j=0;j<i_chen;j++)
{
int temp=(chened_temp[i]-'0')*(chen_temp[j]-'0')+temp_j;
temp_j=temp/10;
temp_l=temp%10;
line[ii++]=temp_l+'0';
}
if(temp_j)
line[ii]=temp_j+'0';
//再翻过来
char line_t[255];
memset(line_t,'\0',255);
j=0;
unsigned int count_line=strlen(line);
while(count_line--)
{
line_t[j++]=line[count_line];
}
add(li_,line_t,offset++);
}
//把结果保存在第一个参数里面
int i_li_=strlen(li_);
while(i_li_--)
{
chen[i_li_]=li_[i_li_];
}
}
int main()
{
//需要倒着相加才行呀;
char a[255];
int n;
memset(a,'\0',sizeof(char)*255);
while(cin>>a>>n)
{
// cin>>n;
// clock_t start=clock();
//--对a进行操作------------------------------------
char a_temp[255];
memset(a_temp,'\0',255);
//------
int b_i_a,f_i_a,f_f_i_a,v_float;//指示除后面0的位置
//指示除取小数点的位置
//指示前置零的位置
int v_strlen=strlen(a);
b_i_a=v_strlen;
bool flag=false;
int temp=v_strlen;
while(temp)
{
if(a[--temp]=='.')
{
flag=true;
break;
}
}
if(flag)
while(b_i_a--)
{
if(a[b_i_a]=='.')
{
b_i_a--;
break;
}
if(a[b_i_a]!='0'&&a[b_i_a]!='.')
break;
}//---计算后置零
else
b_i_a=v_strlen-1;
f_i_a=0;
while(f_i_a<=b_i_a)
{
if(a[f_i_a]=='.')
break;
f_i_a++;
}//---计算小数点的位置
if(f_i_a>b_i_a)
f_i_a--;//如果没有小数点,或者小数点在最后
v_float=b_i_a-f_i_a;//计算出小数点后有几位
int i_index=0;
while(i_index<=f_i_a)
{
a_temp[i_index]=a[i_index];
i_index++;
}
// int i_a_temp=i_index-1;
i_index=f_i_a;//如果没有小数点,那么这时下面的while循环不会执行
while(i_index<b_i_a)
{
a_temp[i_index]=a[i_index+1];
i_index++;
}
f_f_i_a=0;
b_i_a=strlen(a_temp)-1;
while(f_f_i_a<=b_i_a)
{
if(a_temp[f_f_i_a]!='0')
break;
f_f_i_a++;
}//---计算前置零的位置
if(f_f_i_a>b_i_a)
f_f_i_a--;
//下面开始除零了,哈哈
int i=f_f_i_a;
while(f_f_i_a<=b_i_a)
{
a_temp[f_f_i_a-i]=a_temp[f_f_i_a];
f_f_i_a++;
}
if(f_f_i_a>b_i_a)
f_f_i_a=b_i_a;
while(i--)
{
a_temp[b_i_a--]='\0';
}//把后面的数记着补零
v_float*=n;//计算的结果有几位小数点
// cout<<a_temp<<endl;
// cout<<v_float<<endl;
//-------------------------------------------------
char b[255];
for(i=0;i<255;i++)
b[i]=a_temp[i];
// cout<<b<<endl;
//开始计算乘方
for(i=0;i<n-1;i++)
mutile(b,a_temp);
//下面开始安放小数点的位置
if(v_float>0)
{
int count=strlen(b);//b有多少位
int float_count=v_float;//小数有多少位,那么下面的移位就进行多少次
if(count>=float_count+1)
{
int pos_float=count-v_float;//计算出来的pos_float从0开始算起
while(float_count>0)
{
b[count]=b[count-1];
count--;
float_count--;
}
b[pos_float]='.';
}
else
{
int length=float_count+1;
int zero_count=float_count-count;//添加几个0
int goback_count=zero_count+1;//原字符串往后移动几位
i=goback_count;
int j=strlen(b);
while(j)
{
b[j-1+goback_count]=b[j-1];
j--;
}
i=1;
while(zero_count--)
{
b[i++]='0';
}
b[0]='.';
}
}
cout<<b<<endl;
}
//cout<<clock()-start<<endl;
//system("PAUSE");
return 0;
}
总结得挺好!!
回复删除做完题写个总结是必要的,接下来要做的是就是优化代码!每个代码仔细研究的话总有可以简化的地方!
好的程序员是要最少的代码写出最高效的程序!
总之,你还不错啦!
多加油哦!
迈出第一步了~~+U~~
回复删除谢谢czyuan_acm !
回复删除