蓝桥复习2

项目一:九数组分数
1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?
下面的程序实现了该功能,请填写划线部分缺失的代码。
 1 #include <stdio.h>
 2 void test(int x[])
 3 {
 4  int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
 5  int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];
 6  
 7  if(a*3==b) printf("%d / %d
", a, b);
 8 }
 9 void f(int x[], int k)
10 {
11  int i,t;
12  if(k>=9){
13   test(x);
14   return;
15  }
16  
17  for(i=k; i<9; i++){
18   {t=x[k]; x[k]=x[i]; x[i]=t;}
19   f(x,k+1);
20   _____________________________________________ // 填空处
21  }
22 }
23  
24 int main()
25 {
26  int x[] = {1,2,3,4,5,6,7,8,9};
27  f(x,0); 
28  return 0;
29 }

结果:

 1 #include <stdio.h>
 2 
 3 void test(int x[])
 4 {
 5     int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
 6     int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];
 7     
 8     if(a*3==b) printf("%d / %d
", a, b);
 9 }
10 
11 void f(int x[], int k)
12 {
13     int i,t;
14     if(k>=9){
15         test(x);
16         return;
17     }
18     
19     for(i=k; i<9; i++){
20         {t=x[k]; x[k]=x[i]; x[i]=t;}
21         f(x,k+1);
22         {t=x[k];x[k]=x[i];x[i]=t;}// 填空处
23     }
24 }
25     
26 int main()
27 {
28     int x[] = {1,2,3,4,5,6,7,8,9};
29     f(x,0);    
30     return 0;
31 }
{t=x[k];x[k]=x[i];x[i]=t;}
项目二:加法变乘法
我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。
请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int sum=1225;
 5     int tmp1,tmp2; 
 6     for(int i=1;i<47;i++)
 7     {
 8         tmp1=sum-(i+i+1)+(i*(i+1));
 9         for(int j=i+2;j<49;j++)
10         {
11             tmp2=tmp1-(j+j+1)+(j*(j+1));
12             if(tmp2==2015)
13             printf("%d
",i);
14         } 
15     }
16     return 0;
17 }

16

项目三:牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
dp[i][j]=∑k=j−4jdp[i−1][k]
 1 #include <stdio.h>
 2 typedef long long LL;
 3 
 4 LL dp[14][14]; // dp[i][j]: 当前到第i张牌,总共有j张牌时的解的个数
 5 
 6 int main() {
 7     dp[1][0] = dp[1][1] = dp[1][2] = dp[1][3] = dp[1][4] = 1;
 8 
 9     for (int i = 2; i <= 13; i++) {
10         for (int k = 0; k <= 13; k++) {
11             if (k - 4 >= 0) dp[i][k] += dp[i-1][k-4];
12             if (k - 3 >= 0) dp[i][k] += dp[i-1][k-3];
13             if (k - 2 >= 0) dp[i][k] += dp[i-1][k-2];
14             if (k - 1 >= 0) dp[i][k] += dp[i-1][k-1];
15             dp[i][k] += dp[i-1][k];
16         }
17     }
18 
19     printf("%d",dp[13][13]);
20     return 0;
21 }

35981800

项目四:移动距离

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:
1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 .....
我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)
输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。
要求输出一个整数,表示m n 两楼间最短移动距离。
例如:
用户输入:
6 8 2
则,程序应该输出:
4
再例如:
用户输入:
4 7 20
则,程序应该输出:
5
资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
 1 #include <iostream>
 2 
 3 #include <math.h>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 
 9 {
10 
11     int w, m, n;
12 
13     int i, j, k = 1;
14 
15     int mi, mj, ni, nj;
16 
17     cin >> w >> m >> n;
18 
19     int arr[1001][w];
20 
21     for (i = 0; i<1001; i++)
22 
23     {
24 
25         if ((i + 1) % 2 != 0)
26 
27         {
28 
29             for (j = 0; j<w; j++)
30 
31             {
32 
33                 arr[i][j] = k + j;
34 
35             }
36 
37             k = arr[i][j - 1];
38 
39         }
40 
41         else{
42 
43             int f = 1;
44 
45             for (j = w - 1; j >= 0; j--, f++)
46 
47             {
48 
49                 arr[i][j] = k + f;
50 
51             }
52 
53             k = arr[i][0] + 1;
54 
55         }
56 
57     }
58 
59     for (i = 0; i<1001; i++)
60 
61     {
62 
63         for (j = 0; j<w; j++)
64 
65         {
66 
67             if (arr[i][j] == n)
68 
69             {
70 
71                 ni = i;
72 
73                 nj = j;
74 
75             }
76 
77             if (arr[i][j] == m)
78 
79             {
80 
81                 mi = i;
82 
83                 mj = j;
84 
85             }
86 
87         }
88 
89     }
90 
91     int a = abs(mi - ni);
92 
93     int b = abs(mj - nj);
94 
95     printf("%d
",a+b);
96 
97     return 0;
98 
99 }

 项目五:煤球数目

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
....
如果一共有100层,共有多少个煤球?
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int a[101]={0};
 5     for(int i=1;i<101;i++)
 6     {
 7         a[i]=a[i-1]+i;
 8     }
 9     int ans=0;
10     for(int i=1;i<101;i++)
11     {
12         ans+=a[i];
13     }
14     printf("%d
",ans);
15     return 0;
16     
17 }
原文地址:https://www.cnblogs.com/liugangjiayou/p/10585222.html