排名统计问题(c实现)

原创 2005年05月01日 05:42:00
问题描述:
参加任何一项比赛,都会涉及到排名统计问题,由此可见排名统计是多么的重要.这里假设有一项比赛,共有n(1<=n<=200)个人参加,那么请问共有多少种不同的排名(注意:可以很多参赛者在同一个名次,即参赛者名次可以并列)?
数据输入n,输出为不同的排名总数.
如输入
1
2
3
输出为
1
3
13

//程序的性能还不行,算法基本没问题了
==================code================
/**
*Copyright (C) aprin at Xiamen University
*2005-4-24
*/
#include <stdio.h>
#define MAX_N 200
#define MAX_LEN 1000

int cheng(int *a1, int len_a1, int *a2, int len_a2);
int c_fun(int n, int r, int *c) {
  int i, j, k, len, temp[3], len_temp, shang[MAX_LEN], len_shang;

  /*计算pr/n*/
  len=1;
  c[0]=1;
  for(i=0; i<r; i++) {
    j=n-i;
    len_temp=0;
    while(j!=0) {
      temp[len_temp]=j%10;
      len_temp++;
      j/=10;
    }
    len=cheng(c, len, temp, len_temp);
  }

  /*/r!*/
  for(i=0; i<MAX_LEN; i++)
    shang[i]=0;
  for(i=2; i<=r; i++) {
    int temp=len-1, yushu;

    len_shang=0;
    yushu=c[temp];
    while(temp>=0) {
      shang[len_shang]=yushu/i;
      len_shang++;
      yushu%=i;
      temp--;
      yushu=yushu*10+c[temp];
    }
    /*ji suan du yu de 0*/
    k=0;
    while(shang[k]==0)
      k++;
    /*倒转,转移*/
    for(j=0; j<MAX_LEN; j++)
      if(j<(len_shang-k))/* 实际的长度*/
        c[j]= shang[len_shang-1-j];
      else
        c[j]= 0;
    len= len_shang-k;
  }

  return len;
}
int cheng(int *a1, int len_a1, int *a2, int len_a2) {
  int temp[MAX_LEN], i, j;

  for(i=0; i<MAX_LEN; i++)
    temp[i]=0;
  for(i=0; i<len_a2; i++) {
    for(j=0; j<len_a1; j++) {
      temp[i+j]=temp[i+j]+a1[j]*a2[i];
      temp[i+j+1]=temp[i+j+1]+temp[i+j]/10;
      temp[i+j]=temp[i+j]%10;
    }
    if(temp[i+len_a1]>10) {/*ke neng cun zai de zui gao wei chu li*/
      temp[i+len_a1+1]=temp[i+len_a1+1]+temp[i+len_a1]/10;
      temp[i+len_a1]=temp[i+len_a1]%10;
    }
  }
  i=MAX_LEN-1;
  while(temp[i]==0)
    i--;
  for(j=0; j<MAX_LEN; j++)
    a1[j]=temp[j];
  return i+1;
}
int add(int *a1, int len_a1, int *a2, int len_a2) {
  int i,len;

  len=(len_a1>len_a2)?len_a1:len_a2;
  for(i=0; i<len; i++) {
    a1[i+1]+=(a1[i]+a2[i])/10;
    a1[i]=(a1[i]+a2[i])%10;
  }
  len=MAX_LEN;
  while(a1[len-1]==0)
    len--;
  return len+1;
}
int ok(int *renshu, int i, int n) {
  int tot, j;

  tot=0;
  for(j=0; j<=i; j++)
    tot+=renshu[j];
  return tot==n;
}
void output(int *result, int len) {
  int i;

  for(i=len-2; i>=0; i--)
    printf("%d", result[i]);
  putchar('/n');
}
int main(void) {
  int n, i, j, k;
  int renshu[MAX_N];
  int result[MAX_LEN], len;

  scanf("%d", &n);

  for(i=0; i<MAX_LEN; i++)
    result[i]=0;
  len=0;


  for(i=0; i<n; i++) {
    for(j=0; j<=i; j++)
      renshu[j]=1;
    do {
      if(ok(renshu, i, n)) {
    int result_mid[MAX_LEN], len_mid, temp, total_temp;

    len_mid=1;
    result_mid[0]=1;
    total_temp=n;
    for(temp=0; temp<i; temp++) {
      int zuhe[MAX_LEN], len_zuhe;

            len_zuhe=c_fun(total_temp, renshu[temp], zuhe);
          total_temp-=renshu[temp];
        len_mid=cheng(result_mid, len_mid, zuhe, len_zuhe);
    }
    len=add(result, len, result_mid, len_mid);
      }
      renshu[0]++;
      for(j=0; j<i; j++)
    if(renshu[j]>(n-i)) {
      renshu[j+1]++;
      renshu[j]=1;
    }
    }
  while(renshu[i]<=(n-i));
  }

  output(result, len);
  getch();
  return 0;
}

SQL成绩统计分析—排名问题

ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()最近写了近半个月的成绩统计服务 , 被SQL折磨半死,下面介绍下在SQL成绩统计分析中遇到的一些小问题,首先介绍下成绩分...

基于Spark-Streaming滑动窗口实现——实时排名与统计

基于Spark-Streaming滑动窗口实现——实时排名与统计

开发整理-sequoiaDB Java实现统计排名sql

最近使用 sequoiaDB数据库进行开发,发现它对sql的支持还是比较全面的,包括统计sql也可以实现,主要就是它的aggregate函数,支持sql的各种统计函数,我应用到的主要是统计topN排名...

比赛排名计算问题

  • 2012年03月11日 12:07
  • 6KB
  • 下载

百度竞价排名若干问题

  • 2009年03月23日 16:45
  • 28KB
  • 下载

GitHub 上排名前 100 的 Objective-C 项目简介

主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. 若有任何疑问可通过微博@李锦发联系我 ...
  • ruglcc
  • ruglcc
  • 2016年01月19日 15:12
  • 990

歌唱比赛排名C源文件

  • 2009年07月29日 13:20
  • 3KB
  • 下载

GitHub 上排名前 50 的 Objective-C 项目简介

GitHub 上排名前 50 的 Objective-C 项目简介 要对当前 GitHub 排名前 50 的项目做一个简单的简介, 方便开发者快速了解到当前 Objective-C 在 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排名统计问题(c实现)
举报原因:
原因补充:

(最多只允许输入30个字)