C++编程练习-我拿了谁的书?

本文探讨了一个有趣的数学问题——错位排列,即在一场考试中30名学生拿错课本的所有可能情况的数量。通过分析给出的参考代码,我们能够计算出任意数量的学生参与时,所有学生都拿错自己课本的情况总数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
期末考了,龙少和沧海把希望都寄托在课本上,谁知万恶的监考老师要每个学生把书放到讲台上,就这样,这场考试,龙少过的很不爽,考完后,随便拿了本书就走了,回到宿舍后发现不是自己的书,诅丧的他突然陷入沉思,参加考试的30人如果都像他一样拿错书的情况有多少种?(假设每个学生都带书且只带一本)
Input
输入数据的第一行为一个整数T,代表测试数据的个数,接下来T行,每行个包括一个整数N,代表一个教室中学生的个数
Output
对于每组测试数据,输出一个整数,代表拿错书的情况总数
Sample Input
3
1
2
3
Sample Output
0
1
2
Hint
http://baike.baidu.com/view/668994.htm
参考代码

#include <iostream> using namespace std; const int N = 31; const int M = 50; int main(){ int cases,n,i,j,map[N][M]; for(i = 0;i < M;++ i){ map[1][i] = 0; } for(i = 2;i < N;i ++){ for(j = 0;j < M;++ j){ map[i][j] = map[i - 1][j] * i; } if(i % 2 == 0){ map[i][0] += 1; }else{ map[i][0] -= 1; } for(j = 0;j < M;++ j){ if(map[i][j] > 9){ map[i][j + 1] += map[i][j] / 10; map[i][j] %= 10; }else if(map[i][j] < 0){ map[i][j] += 10; map[i][j + 1] -= 1; } } } cin>>cases; while(cases --){ cin>>n; if(n == 1){ cout<<0<<endl; continue; } bool b = false; for(i = M - 1;i >= 0;-- i){ if(map[n][i] > 0 || b){ cout<<map[n][i]; b = true; } } cout<<endl; } return 0; }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值