代码看不懂,有没有人解释一二
题目:长度为N的01串有2的N次方个,求从小到大数第I个去掉“1”的个数大于L的01串
#include <bits/stdc++.h>
int dp[33][33];
int DP(int N,int L)
{
if(N==0||L==0)
return 1;
if(dp[N][L]!=0)
return dp[N][L];
dp[N][L]=DP(N-1,L)+DP(N-1,L-1);
return dp[N][L];
}
int main()
{
int N,L;
long long I;
int i,j,num=0;
int t=0;
cin>>N>>L>>I
I-=1;
for(t=N; t>0; t--){
if(I&&DP(t-1,L)<=I){
printf("1");
I-=DP(t-1,L);
L-=1;
}
else
printf("0");
}
return 0;
}
#include <bits/stdc++.h>
//包含所需头文件
int dp[33][33];
//定义dp二维数组,用于储存组合数,dp[i][j]表示i个元素中取j个元素的组合数
int DP(int N,int L)
//DP函数用于计算组合数,N表示总元素数,L表示取出的元素数
{
if(N==0||L==0)
return 1;
//基准条件,当N或L为0时,组合数为1
if(dp[N][L]!=0)
return dp[N][L];
//如果组合数已经计算过,直接返回
dp[N][L]=DP(N-1,L)+DP(N-1,L-1);
//计算组合数公式,dp[N][L]=dp[N-1][L]+dp[N-1][L-1]
return dp[N][L];
}
int main()
{
int N,L;
//输入总元素数N和取出元素数L
long long I;
//输入整数I
int i,j,num=0;
int t=0;
cin>>N>>L>>I
I-=1; //I减1,作为下标使用
for(t=N; t>0; t--){
//从N开始倒序遍历
if(I&&DP(t-1,L)<=I){
//如果I大于dp[t-1][L],输出1,并减去dp[t-1][L]
printf("1");
I-=DP(t-1,L);
L-=1;
}
else
printf("0");
}
return 0;
}
//这是一道组合数的题目,通过DP函数递归计算组合数,并根据输入I输出相应的组合。
//在解释或实现代码过程中有任何不理解或错误的地方,请指出,我会认真学习和改进。
不知道你这个问题是否已经解决, 如果还没有解决的话:代码
#include<stdio.h>
int issushu(int x)//判断是否为素数
{
int i;
for(i=2;i<=x/2;i++)
{
if(x%i==0)
{
return 0;
}
}
return 1;
}
int main()
{
int n;
int i;
int a = 0;
printf("请输入一个大于二的偶数:");
scanf("%d",&n);
if(n<=2 || n%2!=0 )
{
printf("别闹!输入一个大于二的偶数!");
return 0;
}
for(i=2;i<=n/2;i++)
{
a = n-i;
if(issushu(i) && issushu(a))
{
printf("%d=%d+%d\n",n,i,a);
}
}
return 0;
}
刚开始学,写的不好,轻喷;