1-100中, 求:5个不同数的和小于100的不重复组合的个数

算法比拼中

imi00网友的直接for循环法—— 

public   class   test   { 
public   static   void   main(String[]   args)   { 
int   count   =   0   ; 

for(int   i   =   1;   i   <100;   i++   ) 
for(int   j   =   i   +   1;   j   <   100;   j++   ) 
for(   int   k   =   j   +   1;   k   <   100;   k++   ) 
for   (int   m   =   k   +   1;   m   <   100;   m++   ) 
for(int   n   =   m   +   1   ;   n   <100;   n++   ) 
if(i   +   j   +   k   +   m   +   n   <   100){ 
count++; 
// System.out.println(   i   +   "   "   +   j   +   "   "   
// +   k   +   "   "   +   m   +   "   "   +   n   +   "   sum:"   +   (i   +   j   +   k   +   m   +   n)   ); 

System.out.println(count); 

}最直接最原始的算法:答案为455175,循环次数为71523114 
 
wqs1106网友的改良方案 
——如果没有数学公式可以直接计算,我想我这中方法应该算是循环次数比较少的了,有多少种组合就循环多少次,一次不多一次不少. 
 
public class Test3 { 
public static void main(String[] args) { 
int count = 0 ; 
for(int i=1;i <86;i++) 

for(int j=i+1;j <(88-i); j++ ) 

for( int k= j+1;k <(91-i-j); k++ ) 

for (int m =k+ 1;m <(95-i-j-k); m++ ) 

for(int n = m+ 1;n <(100-i-j-k-m); n++ ) 

if(i + j + k + m + n < 100) 

count++; 






System.out.println(count); 


答案为455175,循环次数为455175。 
 
jseasidej网友的试错法 
 
public class less100 

public static void main(String[] args) 

int a1,a2,a3,a4,a5; 
int sum=0; 
int time=0; 
for(a1=1;a1 <=17;a1++) 

for(a2=a1+1;a2 <=23;a2++) 

if((a2*4+6+a1)> =100) break; 
else 
for(a3=a2+1;a3 <=31;a3++) 

if((a3*3+3+a1+a2)> =100) break; 
else 
for(a4=a3+1;a4 <=46;a4++) 

if((a4*2+1+a1+a2+a3)> =100) break; 
else 

time++; 
sum=sum+(99-a1-a2-a3-a4)-a4; 





System.out.println( "结果是 "+sum+ " 循环次数: "+time); 


运行结果: 结果是455175 循环次数: 24260 
 
jacaranda网友的递归法——比较全面的分析啊 
 
C# code 
using   System; 
using   System.Collections.Generic; 
using   System.Text; 

namespace   Test1 

        class   Program 
        { 
                static   void   Main(string[]   args) 
                { 
                        int   total=0; 
                        int   num   =   0; 

                        for   (int   i   =   1;   i   <   18;   i++)   //第一个数最大只能取到17   
                                for   (int   j   =   i   +   1;   j   <   24;   j++)   //第二个数最大只能取到23   
                                        for   (int   k   =   j   +   1;   k   <   32;   k++)   //第三个数最大只能取到31 
                                                for   (int   l   =   k   +   1;   l   <   47;   l++)   //第四个数最大只能取到46   
                                                { 
                                                        //num++;   放到if   里面 
                                                        int   m   =   99   -   i   -   j   -   k   -   l; 
                                                        if   (m   >   l) 
                                                        { 
                                                                num++;//这里 
                                                                total   =   total   +   (m   -   l); 
                                                        } 
                                                } 
                        System.Console.WriteLine(total); 
                        System.Console.WriteLine(num); 
                        System.Console.ReadLine(); 
                } 
        } 

输出:       
455175               //答案       
24260                   //循环次数 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值