C/C++编程

供稿:hz-xin.com     日期:2024-04-20
大学C 语言编程

每次取字符串的1个比特,然后逐个转换。具体过程如下:
#include#include#includeusing namespace std;int main(){ int N; cin >> N; string str; while (N--) { int res = 0; cin >> str; int i = 2; while (str[i] != '\0') { if (isdigit(str[i])) { res = res * 16 + str[i] - '0'; } else { res = res * 16 + tolower(str[i]) - 'a' + 10; } i++; } cout << res << endl; } return 0;}结果如下:

#include #define MAXLONE_STR 100#define MAXLONE_DIG 50int getDigits(char a[],int target[]){ int i=0,k=0,index_dig=0; const int two_dig=2; while (a[i]!='\0') { if(k==2){ target[index_dig++]=(a[i-1]-48)+((a[i-2]-48)*10); k=0; } else{ i++; k++; } } //当k=1时说明尾部仅有一个数字 if(k==1) target[index_dig++]=(a[i-1]-48); return index_dig; // 返回数组长度}void main(){ char test[MAXLONE_STR]="1234567";int dig[MAXLONE_DIG];int len=getDigits(test,dig);// 输出得到的数字for (int i=0;i<len;i++) printf("%d ",dig[i]);printf("
"); }

//返回0则表示不是有效组,返回非0表示有效组
int is_valid_group(int a[], int bit_similar_array, int num_of_soldier)
{
int i_soldier = 0;
for (; i_soldier < num_of_soldier; ++i_soldier)
{
//此人不出列,不存在冲突
if (0 == (bit_similar_array & (1 << i_soldier)))
continue;

int j_soldier = 0;//i_soldier + 1;
for (; j_soldier < num_of_soldier; ++j_soldier)
{
if (i_soldier == j_soldier)
{
continue;
}

//此人不出列,不存在冲突
if (0 == (bit_similar_array & (1 << j_soldier)))
continue;

if (i_soldier == a[j_soldier] - 1
|| j_soldier == a[i_soldier] -1
)
return 0;
}
}

return 1;
}

int count_valid_group(int a[], int num_of_soldier, int num_of_total_group)
{
int iLoop = 0;
int count = 0;
for (iLoop = 1; iLoop < num_of_total_group; ++iLoop)
{
if (is_valid_group(a, iLoop, num_of_soldier) == 1)
++count;
}
fprintf(stdout, "total valid group is [%d]
", count);
}

int Mult2(int n)
{  
  int sum = 2;  
  int m;  
  if(n==0) return 1;  
  for(m=1;m<n;m++) 
   sum*=2;  
  return sum;
}

int print_soldier_count_test()
{
/*
int num_of_soldier = 7;
int num_of_total_group = 128; // 2的7次方
int a[7] = {0, 1, 1, 2, 2, 3, 3};
*/
int num_of_soldier = 3;
int num_of_total_group = 8; // 2的3次方
int a[3] = {0, 1, 1};

scanf("%d", &num_of_soldier);
//num_of_total_group = 2 << (num_of_soldier - 1); //2的N次方的另一种用法
num_of_total_group = Mult2(num_of_soldier);
//此处可以判断是否有效数据
int *p_a = NULL;
p_a = malloc(sizeof(int)*num_of_soldier);
p_a[0] = 0; //G将军的上级为0
int iLoop = 0;
for (iLoop = 1; iLoop < num_of_soldier; ++iLoop)
{
scanf("%d", &(p_a[iLoop]));
}

int count = count_valid_group(p_a, num_of_soldier, num_of_total_group);
free(p_a);
return count;
}

 //测试在main中直接调用print_soldier_count_test()函数,里面有一些测试数据,可自己增删。



选拔部队人数 input N
总人数 输入 M
X=M
二位数组b[N][总人数] 初值为0
function(a[i],n,m){
for (i =0;i<n;i++ ){
for(j=0;j<m;j++){
标记a[j]及期直接上级;

得到数据特征值 剩余人数 X;
n--;
m = X;

if(n==0){
sum++;

}
递归function(a[i],n,m);

}
}
sum = sum/(N的组合)
sum应该是输出了 不过效率很低~~这是把所有可能按树展开计算叶子节点的数目,由于题目要求的是组合 而sum的原值应该是排列 所以应该除一下N的组合数