从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都为两位数