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



评论

  1. 总结得挺好!!
    做完题写个总结是必要的,接下来要做的是就是优化代码!每个代码仔细研究的话总有可以简化的地方!
    好的程序员是要最少的代码写出最高效的程序!
    总之,你还不错啦!
    多加油哦!

    回复删除
  2. 迈出第一步了~~+U~~

    回复删除

发表评论

此博客中的热门博文

提交了30次才AC ---【附】POJ 2488解题报告

n个进程共享m个资源得死锁问题证明