过程函数与递归
Posted dahaihaohan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过程函数与递归相关的知识,希望对你有一定的参考价值。
P1028 数的计算
题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数 nn ):
先输入一个自然数 nn ( n le 1000n≤1000 ),然后对此自然数按照如下方法进行处理:
-
不作任何处理;
-
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
-
加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入输出格式
输入格式:
11 个自然数 nn ( n le 1000n≤1000 )
输出格式:
11 个整数,表示具有该性质数的个数。
输入输出样例
说明
满足条件的数为
6,16,26,126,36,136
思路:递推;
1 include<bits/stdc++.h> 2 using namespace std; 3 int dp[1005]; 4 int main(){ 5 int n; 6 scanf("%d",&n); 7 for(int i=0;i<=n;i++){ 8 dp[i]=1; 9 } 10 for(int i=1;i<=n;i++){ 11 for(int j=1;j<=i/2;j++){ 12 dp[i]+=dp[j]; 13 } 14 } 15 printf("%d ",dp[n]); 16 }
P1036 选数
题目描述
已知 nn 个整数 x_1,x_2,…,x_nx1?,x2?,…,xn? ,以及 11 个整数 kk ( k<nk<n )。从 nn 个整数中任选 kk 个整数相加,可分别得到一系列的和。例如当 n=4,k=3n=4,k=3 , 44 个整数分别为 3,7,12,193,7,12,19 时,可得全部的组合与它们的和为:
3+7+12=223+7+12=22
3+7+19=293+7+19=29
7+12+19=387+12+19=38
3+12+19=343+12+19=34 。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数: 3+7+19=293+7+19=29 。
输入输出格式
输入格式:
键盘输入,格式为:
n,kn,k ( 1 le n le 20,k<n1≤n≤20,k<n )
x_1,x_2,…,x_n (1 le x_i le 5000000)x1?,x2?,…,xn?(1≤xi?≤5000000)
输出格式:
屏幕输出,格式为: 11 个整数(满足条件的种数)。
输入输出样例
4 3 3 7 12 19
1
思路:搜索;
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[25]; 4 int n,k; 5 int co=0; 6 void dfs(int t,int ii); 7 int main(){ 8 scanf("%d%d",&n,&k); 9 for(int i=0;i<n;i++){ 10 scanf("%d",&a[i]); 11 } 12 dfs(0,0); 13 printf("%d ",co); 14 } 15 int sum=0; 16 int pan(int s); 17 void dfs(int t,int ii){ 18 if(t==k){ 19 if(pan(sum)){ 20 co++; 21 } 22 } 23 else{ 24 for(int i=ii;i<n;i++){ 25 sum+=a[i]; 26 dfs(t+1,i+1); 27 sum-=a[i]; 28 } 29 } 30 } 31 int pan(int s){ 32 for(int i=2;i<=sqrt(s);i++){ 33 if(s%i==0){ 34 return 0; 35 } 36 } 37 return 1; 38 }
P1149 火柴棒等式
题目描述
给你n根火柴棍,你可以拼出多少个形如“ A+B=CA+B=C ”的等式?等式中的 AA 、 BB 、 CC 是用火柴棍拼出的整数(若该数非零,则最高位不能是 00 )。用火柴棍拼数字 0-90?9 的拼法如图所示:
注意:
-
加号与等号各自需要两根火柴棍
-
如果 A≠BA≠B ,则 A+B=CA+B=C 与 B+A=CB+A=C 视为不同的等式( A,B,C>=0A,B,C>=0 )
-
nn 根火柴棍必须全部用上
输入输出格式
输入格式:
一个整数 n(n<=24)n(n<=24) 。
输出格式:
一个整数,能拼成的不同等式的数目。
输入输出样例
说明
【输入输出样例1解释】
22 个等式为 0+1=10+1=1 和 1+0=11+0=1 。
【输入输出样例2解释】
99 个等式为:
0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11
思路:枚举;
1 #include<bits/stdc++.h> 2 int a[20001]={6}; 3 int c[10]={6,2,5,5,4,5,6,3,7,6}; 4 int n; 5 int sum=0; 6 int i,j; 7 int main(){ 8 scanf("%d",&n); 9 for(i=1;i<=20000;i++){ 10 j=i; 11 while(j>=1){ 12 a[i]=a[i]+c[j%10]; 13 j=j/10; 14 } 15 } 16 for(i=0;i<=10000;i++) 17 for(j=0;j<=10000;j++) 18 if(a[i+j]+a[j]+a[i]+4==n) 19 sum++; 20 printf("%d ",sum); 21 }
以上是关于过程函数与递归的主要内容,如果未能解决你的问题,请参考以下文章