分享

每位选手需要回答10个问题(其编号为1到10)越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相

 Pakin 2014-03-18

/******************************************************
题目:  某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:

  每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。

  每位选手都有一个起步的分数为10分。

  某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?

  如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。

  你的任务是算出所有可能情况。每个答案占一行。
时间:2012-05-15  17:48
******************************************************************************/
/************************下面先用个递归的,这个题用穷举也可以做,在后面在附加个穷举的(嵌套循环虽多,但容易理解)
**************/
# if 0
# include <stdio.h>

//首先定义个全局数组(用来存放0 1串)
int a[12];

//函数声明
void print(void);
void find_select(int number, int score);

int main()
{
 
 find_select(1,10);//为了方便,数组的下标从1开始,表示第一个题
 return 0;
}

//定义函数,用来寻找答对,答错的题
void find_select(int number, int score)
{
 int i;

 //当题的数目大于10个说明已经答题完成
 if(number>10)
 {
  //如果答题的分数为100就输出数组中的串
  if(100 == score)
   print();
 }
 else
 {
  for(i = 1; i>=0; i--)
  {
   a[number] = i;

   //每次调用函数都会有一对if else,并却执行完if接下来就要执行else(因为1完后会变为0),因为这样在这一个函数中在if中score的改变会影响到else中的score
   //所以在执行else时,要先把score还原
   if(1 == i)
   {
    score *= 2;
    find_select(number+1, score);
    score /= 2;  //if else无论调用多少次,都会在每次调用中存在一对,所以执行完上面一句,要把score还原,在执行接下来的else
   }
   else
   {
    score -= number;
    find_select(number+1, score);
    //在下面加不加 score += number;无所谓,因为执行完上面一句,函数就要返回到上一层,上一层的score与这一层的score是两个变量
   }
  
  }
 }
}

//定义函数,输出数组中的串
void print(void)
{
 int i;

 for(i = 1; i<11; i++)
 {
  printf("%d", a[i]);
 }
 printf("\n");
}

/****************************************************
1011010000
0111010000
0010110011
Press any key to continue
***************************************************/

# endif

/************************************************
下面就是穷举法,这个方法很好用的,虽然这个的效率低,但在算法中,他的地位是不低的;就像在破解qq密码时就是用到穷举的方法
当然要是光靠穷举,那时间用的可不是个小的数目,要是在加上本“词典”,呵,那就不错啦(这里的词典可不是你用的词典哦,自己去查吧,没准你还能发现点东西呢)
至于咋破解,不会哦
*******************************************************************************************/
//下面的这点循环对现在的个人机来说应该不算什么了吧!
# if 1

# include <stdio.h>
int a[12];
//函数声明
void print(void);
int main()
{
 //先申请10变量,用来for循环
 int a1, a2, a3, a4, a5, a6, a7, a8, a9, a0;
 int number = 0;
 int score = 10;
 int sum = 0;
 int i;

 for(a1 = 1; a1>=0; a1--)
 {
  a[1] = a1;
  for(a2 = 1; a2>=0; a2--)
  { 
   a[2] = a2;
   for(a3 = 1; a3>=0; a3--)
   {
    a[3] = a3;
    for(a4 = 1; a4>=0; a4--)
    {
     a[4] = a4;
     for(a5 = 1; a5>=0; a5--)
     {
      a[5] = a5;
      for(a6 = 1; a6>=0; a6--)
      {
       a[6] = a6;
       for(a7 = 1; a7>=0; a7--)
       {
        a[7] = a7;
        for(a8 = 1; a8>=0; a8--)
        {
         a[8] = a8;
         for(a9 = 1; a9>=0; a9--)
         {
          a[9] = a9;
          for(a0 = 1; a0>=0; a0--)
          {
           a[10] = a0;
          
           //遍历10个数组元素,根据元素状态,进行加分,或减分
           for(i = 1; i<=10; i++)
           {
            if(a[i] == 1)
            {
             score *= 2;
             sum += score;
            }
            else
            {
             score -= i;
             sum += score;
            }
           }
           //当分数够了100分时就输出啦
           if(100 == score)
           {
            print();
           }
           //别忘了对score进行初始化,为下一次的运算做准备
           score = 10;
          }
         }
        }
       }
      }
     }
    }
   }
  }
 }
 return 0;
}

//定义函数,对串进行输出
void print(void)
{
 int i;

 for(i = 1; i<11; i++)
 {
  printf("%d", a[i]);
 }
 printf("\n");
}

/************************************
1011010000
0111010000
0010110011
Press any key to continue
*******************************************/
# endif

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多