请懂C的朋友帮忙看一下 怎么想也想不通

时间:2022-05-11 21:51:57
有三组相同数字 0,1,2,3,4,5,6,7,8,9,   然后分别在这三组数字中随机的抽取一个 把三个抽出来的数字相加  得到每个结果的概率是多少? 把它们相加得到的结果是0-27中的一个数  我用程序实现的是有几种方法能得到同一种结果  可是编出来总是不对 也不知道哪里错了 由于刚刚学C  所以请教一下各位懂得人  谢谢了 
#include<stdio.h>
void main()
{
int i,d,e,f,m,h;
int a[10]={0,1,2,3,4,5,6,7,8,9},b[10]={0,1,2,3,4,5,6,7,8,9},c[10]={0,1,2,3,4,5,6,7,8,9};
 for(i=0;i<=27;i++)
    {
     m=0;
     for(d=0;d<=9;d++)
       for(e=0;e<=9;e++)
          for(f=0;f<=9;f++)
           {
             h=a[d]+b[e]+c[f];
             if(i=h)
             m=m+1;  
             printf("%d\n",h);
           } 
           printf("%d %d\n",i,m);
     }
              
}

9 个解决方案

#1


 if(i=h) 改为if(i==h)
C中=为赋值==为比较

#2


呵呵,楼主以后要看仔细了。

#3


 for(f=0;f <=9;f++) 
 { 
      h=a[d]+b[e]+c[f]; 
      if(i=h)             // "="是付值符号,  "=="才是比较符号
       {                      //  比较语句内部不止一条语句时,要用{}括起来 
           m=m+1;   
           printf("%d\n",h); 
        }
   } 

#4


另外,第一层循环别要:
for(i=0;i <=27;i++) 

   m=0; 
   for(d=0;d <=9;d++)  //则连续的三层循环,只要把d=9的这一层循环完成,就已经完成了搂住想要的所有组和了
     for(e=0;e <=9;e++) //最外面的i<=27的循环就没必要了阿!
       for(f=0;f <=9;f++) 
建议改成:
i=27;
for(d=0;d <=9;d++) 
   for(e=0;e <=9;e++) 
       for(f=0;f <=9;f++) 
       { 
             h=a[d]+b[e]+c[f]; 
             if(i>=h)
             { 
                 m=m+1;   
                 printf("%d\n",h);
              } 
         }  
        printf("%d %d\n",i,m); 
     } 
         

#5


谢谢各位了  问题解决了   自己以后要注意了

#6


需求分析做的不到位了,
用排列组合的知识你就该知道,你的循环要进行27*10*10*10=27000次。算法复杂度上你这个程序就已经遭淘汰了……

要算概率,就该知道一共多少种组合,以及出现某个结果的次数。


我初步想法是用你要求的结果来控制算法复杂度,比如说和为5,那么第一、二、三层循环是绝对过不了5的,再如和为12,如果第一层循环过了4,那么第二、三层循环是过不了8的(同理,此时候如果第二层循环过了2,那么第三层循环不会超过6),剩下的问题你就可以自己解决了。
虽然说起来复杂了点,可是算法复杂度上要大大降低,可以提速很多的。

#7


谢谢 Kakabulusi 朋友  我知道我这种算法复杂度太高 肯定不能用到大型的程序当中 写这个只是实现一个简单的功能 匆匆忙忙的就没往细里想  

#8


你写的程序跟你自己描述的有出入,你这个是随机抽取吗?

#9


仔细一点就ok了,:)

#1


 if(i=h) 改为if(i==h)
C中=为赋值==为比较

#2


呵呵,楼主以后要看仔细了。

#3


 for(f=0;f <=9;f++) 
 { 
      h=a[d]+b[e]+c[f]; 
      if(i=h)             // "="是付值符号,  "=="才是比较符号
       {                      //  比较语句内部不止一条语句时,要用{}括起来 
           m=m+1;   
           printf("%d\n",h); 
        }
   } 

#4


另外,第一层循环别要:
for(i=0;i <=27;i++) 

   m=0; 
   for(d=0;d <=9;d++)  //则连续的三层循环,只要把d=9的这一层循环完成,就已经完成了搂住想要的所有组和了
     for(e=0;e <=9;e++) //最外面的i<=27的循环就没必要了阿!
       for(f=0;f <=9;f++) 
建议改成:
i=27;
for(d=0;d <=9;d++) 
   for(e=0;e <=9;e++) 
       for(f=0;f <=9;f++) 
       { 
             h=a[d]+b[e]+c[f]; 
             if(i>=h)
             { 
                 m=m+1;   
                 printf("%d\n",h);
              } 
         }  
        printf("%d %d\n",i,m); 
     } 
         

#5


谢谢各位了  问题解决了   自己以后要注意了

#6


需求分析做的不到位了,
用排列组合的知识你就该知道,你的循环要进行27*10*10*10=27000次。算法复杂度上你这个程序就已经遭淘汰了……

要算概率,就该知道一共多少种组合,以及出现某个结果的次数。


我初步想法是用你要求的结果来控制算法复杂度,比如说和为5,那么第一、二、三层循环是绝对过不了5的,再如和为12,如果第一层循环过了4,那么第二、三层循环是过不了8的(同理,此时候如果第二层循环过了2,那么第三层循环不会超过6),剩下的问题你就可以自己解决了。
虽然说起来复杂了点,可是算法复杂度上要大大降低,可以提速很多的。

#7


谢谢 Kakabulusi 朋友  我知道我这种算法复杂度太高 肯定不能用到大型的程序当中 写这个只是实现一个简单的功能 匆匆忙忙的就没往细里想  

#8


你写的程序跟你自己描述的有出入,你这个是随机抽取吗?

#9


仔细一点就ok了,:)