数学研发论坛

 找回密码
 欢迎注册
查看: 203|回复: 4

[讨论] 这样的十位有多少个?

[复制链接]
发表于 2017-11-30 14:25:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?欢迎注册

x
有45个数字:9个1,8个2,7个3,6个4,5个5,4个6,3个7,2个8,1个9。
在这45个数字中选十个数字组成一个十位数,这样的十位有多少个?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-11-30 16:28:18 | 显示全部楼层
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 3 天前 | 显示全部楼层
不知道你是要搞清楚具体怎样计算,还是只要知道满足条件的十位数有多少个?
1.搞清楚具体怎样计算,一般可采用递归法。
$设n_1个1,n_2个2,n_3个3,n_4个4,n_5个5,n_6个6,n_7个7,n_8个8,n_9个9组成数字中,选m个数字组成一个m位数,这样的m位数共有f_z(n_1,n_2,n_3,n_4,n_5,n_6,n_7,n_8,n_9,m)个$
$则f_z(9,8,7,6,5,4,3,2,1,10)=C_{10}^{1}f_z(9,8,7,6,5,4,3,2,0,9)  {10位数中出现9情况,共有C_{10}^{1}种不同占位}$
$+f_z(8,8,7,6,5,4,3,2,0,9)  {10位数中不出现9情况,第10位为1}$
$+f_z(9,7,7,6,5,4,3,2,0,9)  {10位数中不出现9情况,第10位为2}$
$+f_z(9,8,6,6,5,4,3,2,0,9)  {10位数中不出现9情况,第10位为3}$
$+f_z(9,8,7,5,5,4,3,2,0,9)  {10位数中不出现9情况,第10位为4}$
$+f_z(9,8,7,6,4,4,3,2,0,9)  {10位数中不出现9情况,第10位为5}$
$+f_z(9,8,7,6,5,3,3,2,0,9)  {10位数中不出现9情况,第10位为6}$
$+f_z(9,8,7,6,5,4,2,2,0,9)  {10位数中不出现9情况,第10位为7}$
$+f_z(9,8,7,6,5,4,3,1,0,9)  {10位数中不出现9情况,第10位为8}$
$=.........  {这样一直可以递归下去,直到最后等式中每一项都可以明确得出具体数值}$
2.只想知道满足条件的十位数有多少个,一般可采用暴力法(即编程法:将每一个十位数(明显不满足条件的可去掉)都进行判别是否满足条件,并记下否满足条件的十位数共有几个)。
在很一般的电脑上,我用此法(计算时间不到一分钟)得出:满足条件的十位数有1548342622个,希望有高手来验证这个结果。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 前天 18:19 | 显示全部楼层
我的结果是2103049130种
  1. #include <stdio.h>
  2. #include <limits.h>

  3. unsigned long long lltotal;
  4. unsigned long long lltotal2;
  5. int fac[11];
  6. void initfac()
  7. {
  8.     int i;
  9.     fac[0]=1;
  10.     for(i=1;i<=10;i++){
  11.         fac[i]=fac[i-1]*i;
  12.     }
  13. }

  14. void dump_pattern(int a[])
  15. {
  16.     int i;
  17.     for(i=9;i>=1;i--){
  18.         printf("%d ",a[i]);
  19.     }
  20. }

  21. void enumall(int a[], int k, int s)//a[1]+a[2]+...+a[k]=s
  22. {
  23.     int i;
  24.     if(k==1&&s<=1){
  25.         a[1]=s;
  26.         dump_pattern(a);
  27.         int c=fac[10];
  28.         for(i=1;i<=9;i++){
  29.             c/=fac[a[i]];
  30.         }
  31.         printf("%d\n",c);
  32.         lltotal+=c;
  33.         if(lltotal2>=ULLONG_MAX-1-c){
  34.             lltotal2+=c+1;
  35.         }else{
  36.             lltotal2+=c;
  37.         }
  38.         return;
  39.     }
  40.     int start = s;
  41.     if(start>k)start=k;
  42.     for(i=start;i>=0;i--){
  43.         a[k]=i;
  44.         enumall(a,k-1,s-i);
  45.     }
  46. }

  47. int main()
  48. {
  49.     int a[10];
  50.     initfac();
  51.     enumall(a,9,10);
  52.     printf("Total %llu, %llu\n", lltotal, lltotal2);
  53.     return 0;
  54. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 前天 19:03 | 显示全部楼层
mathe 发表于 2017-12-9 18:19
我的结果是2103049130种

答案应该是2103049130。我想找一个数学公式来表达,怎么也写不好!下面的公式就是其中一个,减得太多了!
\(9^10-1×9-8×10×8-8^2×45×7-8^3×120×6-8^4×210×5-8^5×252×4-8^6×210×3-8^7×120×2-8^8×45×1=2025622088\)
          9^10:用9个数字组成的全体10位数。
8^0× 1 ×9(1,2,3,4,5,6,7,8,9):10个数字相同的10位数。
8^1×10×8(2,3,4,5,6,7,8,9):9个数字相同的10位数。
8^2×45×7(3,4,5,6,7,8,9):8个数字相同的10位数。
8^3×120×6(4,5,6,7,8,9):7个数字相同的10位数。
8^4×210×5(5,6,7,8,9):6个数字相同的10位数。
8^5×252×4(6,7,8,9):5个数字相同的10位数。
8^6×210×3(7,8,9):4个数字相同的10位数。
8^7×120×2(8,9):3个数字相同的10位数。
8^8×45×1(9):2个数字相同的10位数。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|Archiver|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2017-12-11 12:05 , Processed in 0.056464 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表