对待数组一定要MEMSET()--附带POJ1416解题报告

这两天事情太多,而且比赛临近,从昨天下午一直在搞1416,其实昨天晚上已经搞的差不多了,就差一点东西了。谁知道,今天早上补全以后,在DEV下运行,竟然出现好多莫名的错误。


找程序的逻辑, 一遍又一遍,发现错误依旧 ,偶的自信心以数量级的下降。幸亏,还懂一些二分法的思想,先把主程序逻辑看是否正确, 把一些次要的先注释掉,一点一点找,呵呵。


最后问题是,我用到的两个数组,都没有初始化,造成一些错误。
另外,还有一点必须要注意的是,如果数组越界,也很可能会导致问题错误的 ,感觉数组越界后,会循环访问现在的数组,可能这一点和编译器有关吧。

POJ 1416和 王祥骆老师曾经讲的PRINT WORDS IN LINE有点相像。因此思路并不是很难。主要是细节比较多。


快要比赛了,现在偶心里面还是没有底,不会的东西太多了!唉,偶的黑头发呀,一定要挺住,绝对不能换成白颜色呀!
POJ 1416源代码:


Source Code





















Problem: 1416 User: omycle
Memory: 252K Time: 0MS
Language: C++ Result: Accepted



  • Source Code
    #include <iostream>
    using namespace std;
    int a=0;
    int target=376;
    int shuzu[6]/*={1,4,4,1,3,9}*/;
    int Save[6];
    int ForSave[6];
    int Ctol/*=5*/;//判断数字数组的位数

    void Init()
    {
    char temp_[6];
    memset(temp_,0,sizeof(char)*6);
    int temp=a;
    int i=0;
    while(temp!=0)
    {
    temp_[i++]=temp%10+'0';
    temp=temp/10;
    }
    Ctol=i-1;//数字数组的位数
    int max=0;
    max=Ctol;
    i=0;
    while(max>-1)
    shuzu[i++]=temp_[max--]-'0';
    }

    int Equal=-1;
    int ok=false;
    int Sum=0;
    int Wei=0;//说明最终的结合中,保存到数组的第几位了,这样方便输出
    void digui(int wei,int value,int save_wei/*保存数的第几位*/)
    {

    if(wei>Ctol)
    {
    if(value<=target)
    {
    if(!ok)
    {
    Sum=value;//把数值保存起来,呵呵!
    for(int k=0;k<=Ctol;k++)
    {
    ForSave[k]=Save[k];
    Wei=save_wei;
    }
    ok=true;
    }
    else if((target-Sum)>(target-value))
    {
    Sum=value;
    for(int k=0;k<=5;k++)//这个要全部赋值滴
    {
    ForSave[k]=Save[k];
    Wei=save_wei;
    }
    }
    else if((target-Sum)==(target-value))
    {

    Equal=value;
    Sum=value;
    }
    }
    return ;
    }
    for(int i=wei;i<=Ctol;i++)//从现在到第几
    {
    int j=wei;
    int temp_value=0;
    for( j=wei;j<=i;j++)
    {
    temp_value=temp_value*10+shuzu[j];
    }
    //把这个temp_value的数值应该保存起来,拽拽!
    Save[save_wei]=temp_value;
    temp_value+=value;
    digui(i+1,temp_value,save_wei+1);
    Save[save_wei]=0;
    }



    }

    int main()
    {

    while(1)
    {
    cin>>target;
    cin>>a;
    if(target==0&&a==0)
    break;
    memset(ForSave,0,sizeof(ForSave));
    memset(Save,0,sizeof(Save));
    if(a==target)
    {
    printf("%d %d\n",a,target);
    continue;
    }
    Equal=-1;
    Sum=0;
    ok=false;
    Init();
    digui(0,0,0);
    if(Equal!=Sum)
    {
    if(ok)
    {
    printf("%d ",Sum);
    for(int i=0;i<Wei;i++)
    {
    printf("%d ",ForSave[i]);
    }
    }
    else
    {
    printf("error");

    }
    }
    else
    {
    printf("rejected");

    }
    printf("\n");
    //system("pause");
    }

    return 0;
    }


评论

  1. 能不能尽量把project的题目也给出来 这样看代码知道是将什么的
    o(∩_∩)o...

    回复删除
  2. 努力就行 开心就好 不要给自己太大的压力
    (*^__^*) ……

    回复删除
  3. 呵呵 ,谢谢,题目中的source code内都有链接

    回复删除

发表评论

此博客中的热门博文

Linux/ARM Page Table Entry 属性设置分析

由RFE指令引发的一串故事

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