• 2011蓝桥杯(高职)


    从4个人中选2个人参加活动,一共有6种选法。

    从n个人中选m个人参加活动,一共有多少种选法?下面的函数实现了这个功能。

    请仔细分析代码,填写缺少的部分(下划线部分)。

    注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。 直接写在题面中不能得分。

    // n 个元素中任取 m 个元素,有多少种取法 int f(int n, int m) {  if(m>n) return 0;  if(m==0) _______________;

     return f(n-1,m-1) + _____________; }

     1 #include "stdafx.h"
     2 
     3 // n 个元素中任取 m 个元素,有多少种取法
     4 int f(int n, int m)
     5 {
     6     if(m>n) return 0;
     7     if(m==0) return 1;
     8 
     9     return f(n-1,m-1) + f(n-1,m);
    10 }
    11 
    12 
    13 int main(int argc, char* argv[])
    14 {
    15     printf("%d\n", f(10,3));
    16     printf("%d\n", f(5,3));
    17     printf("%d\n", f(5,2));
    18 
    19     return 0;
    20 }

    如果一个自然数的平方数的尾部仍然为该自然数本身,则称其为自守数。 例如: 5 x 5 = 25 76 x 76 = 5776 625 x 625 = 390625

    下面代码的目的是寻找出2千万以内的所有自守数。

    注意,2千万的平方已经超出了整数表达的最大范围,所以该程序使用了一个巧妙的方案。 如果我们仔细观察乘法的计算过程,就会发现实际上对乘积的尾数有贡献的环节,从而不用真正计算出整个乘积。

    请分析代码并填写缺失的部分。

    注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。 直接写在题面中不能得分。

    void zishou() {  int n;  for(n=1; n<20 * 1000 * 1000; n++)  {   int n2 = n;    int m = 0;   for(;;)   {    if(n2==0)    {     printf("%d\n", n);     break;    }        int k = n2 % 10;  // 从末尾开始,取出乘数的每位数字    m += k * n;  // 累计乘积    if(________________m==0) break;    m = m / 10;  // 舍去累计乘积的末位    n2 = ______________n2/10_;    }  } }

     1 #include "stdafx.h"
     2 
     3 //因为返回值是void,而两个空都需要值所以绝对不是递归啦 
     4 void zishou()
     5 {
     6     int n;
     7     for(n=1; n<20 * 1000 * 1000; n++)
     8     {
     9         int n2 = n;
    10         int m = 0;
    11         for(;;)
    12         {
    13             if(n2==0) 
    14             {
    15                 printf("%d\n", n);
    16                 break;
    17             }
    18             int k = n2 % 10;
    19             m += k * n;
    20             if(m % 10 != k) break;//空1 ,这个费了些时间 
    21             m = m / 10;
    22             n2 = n2 / 10;//空2 ,这个空我一看出口就写出来啦 
    23         }
    24     }
    25 }
    26 
    27 int main(int argc, char* argv[])
    28 {
    29     zishou();
    30     return 0;
    31 }

    看下面的算式:

    □□ x □□ = □□ x □□□

    它表示:两个两位数相乘等于一个两位数乘以一个三位数。

    如果没有限定条件,这样的例子很多。

    但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。 该算式中1至9的每个数字出现且只出现一次!

    比如: 46 x 79 = 23 x 158 54 x 69 = 27 x 138 54 x 93 = 27 x 186 .....

    请编程,输出所有可能的情况!

    注意:左边的两个乘数交换算同一方案,不要重复输出!

    要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。 相关的工程文件不要拷入。 对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性; 不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。

     1 //这个程序没有去重 ,也就是说46 x 79 = 23 x 158和79 x 46 = 23 x 158 都会输出,TMD输出重复结果也扣分呢 
     2 //考虑用set去重,若是不回去重把正确结果直接输出不知道会扣多少分呢 
     3 //全排列即可,关键是写出C语言程序
     4 #include  <iostream>
     5 #include <cstring>
     6 #include <algorithm>
     7 #include <cstdlib>
     8 using namespace std;
     9 
    10 int a[10] = {0};
    11 
    12 int main()
    13 {
    14      int i,j,k;
    15      for(i=0; i<9; i++)
    16           a[i+1] = i+1;
    17      do
    18      {
    19           if(a[5]<a[1]&&a[5]<a[3])//因为后面是三位数必定大于等号前的两个数,所以等号右边的两位数必须要小于左边的两位数 
    20           {
    21                int temp1 = a[1]*10 + a[2];
    22                int temp2 = a[3]*10 + a[4];
    23                int temp3 = a[5]*10 + a[6];
    24                int temp4 = a[7]*100 + a[8]*10 + a[9];
    25                int ans1 = temp1*temp2;
    26                int ans2 = temp3*temp4;
    27                if(ans1 == ans2)
    28                     cout<<a[1]<<a[2]<<" x "<<a[3]<<a[4]<<" = "<<a[5]<<a[6]<<" x "<<a[7]<<a[8]<<a[9]<<endl;
    29           }
    30           
    31      }while(next_permutation(a+1,a+10));//犯了个错误,后面的参数不是 (a + 9)
    32      //while(1);
    33      system("pause");
    34      return 0;
    35 }
    36 
    37 
    38      
     1 //1到n全排列 ,字典序,但是不可重排
     2 #include <iostream>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 void solve(int n,int *a,int cur)
     7 {
     8      if(cur==n)
     9      {
    10           cout<<a[0];
    11           for(int i=1; i<n; i++)
    12                cout<<" "<<a[i];
    13           cout<<endl;
    14      }
    15      else 
    16      {
    17           for(int i=1; i<=n; i++)
    18           {
    19                bool ok = 1;
    20                for(int j=0; j<cur; j++)
    21                if(a[j]==i)
    22                     ok = 0;
    23                if(ok)
    24                {
    25                     a[cur] = i;
    26                     solve(n,a,cur+1);
    27                }
    28           }
    29      }
    30 }
    31 
    32 int main()
    33 {
    34      int i,j,k;
    35      int a[] = {1,2,3,4,5,6,7,8,9};//数组a没必要输入,因为该程序就是产生1到n的全排列 
    36      solve(4,a,0);
    37      while(1);
    38      return 0;
    39 }
    40 
    41  
     1 //输入数据 ,字典序,可重排
     2 #include <iostream>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 int a[10] = {0};
     7 
     8 void solve(int n,int *a,int *p,int cur)
     9 {
    10      if(cur==n)
    11      {
    12           cout<<a[0];
    13           for(int i=1; i<n; i++)
    14                cout<<" "<<a[i];
    15           cout<<endl;
    16      }
    17      else 
    18      {
    19           for(int i=1; i<=n; i++)
    20           {
    21                int cnt1,cnt2;
    22                cnt1 = cnt2 = 0;
    23                for(int j=0; j<n; j++)
    24                     if(p[j]==p[i])
    //原来写成了p[j]==i
    25 cnt1++; 26 for(int j=0; j<cur; j++) 27 if(a[j]==p[i]) 28 cnt2++; 29 if(cnt2<cnt1)//保证重拍 30 { 31 a[cur] = i; 32 solve(n,a,p,cur+1); 33 } 34 } 35 } 36 } 37 38 int main() 39 { 40 int i,j,k; 41 int p[] = {1,2,2,4,5,6,7,8,9}; 42 solve(4,a,p,0); 43 while(1); 44 return 0; 45 } 46 47

       如何去重呢,网友给了个主意。bool hash[10001];
    hash[7946]=0代表79*46这个结果还没出现过
    =1代表已经出现过
    不过这样结果貌似会少一些
    如果a*b=c*d=e*f的话
    你可以开一个更大的数组,把a b c都记录下来
    开一个一百万的数组
    hash[1000000]
    a*b=c*d
    hash[abc] a b c都为两位数

  • 相关阅读:
    最长不下降子序列 从O(n)到O(nlogn)
    【NOIP1999】【洛谷P1020】导弹拦截
    【NOI2001】【洛谷P2024】食物链
    【2017中国大学生程序设计竞赛
    【2017中国大学生程序设计竞赛
    【NOIP】【洛谷P1029】最大公约数和最小公倍数问题
    【NOIP2009】【洛谷P1072】Hankson 的趣味题
    C++模板(2)
    Java中跳出循环的方法
    localeCompare() 方法实现中文的拼音排序
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2834742.html
Copyright © 2020-2023  润新知