首页 > 代码库 > 经典算法(1~30)(一)

经典算法(1~30)(一)

【程序1】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去
掉不满足条件的排列。

 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5     int i, j, k, count=0; 6     for(i=1; i<=4; i++) 7     { 8         for(j=1; j<=4; j++) 9         {10             for(k=1; k<=4; k++)11             {12                 if(i==j || i==k || j==k)13                     continue;14                 else15                 {16                     cout<<i*100+j*10+k<<"    ";17                     count++;18                     if(count%10==0)19                         cout<<endl;20                 }21             }22         }23     }24     cout<<"sum="<<count<<endl;25     system("pause");26     return 1;27 }

进一步考虑输出格式,输出的三位数不一定非得乘上各自基数相加,依次输出即可

 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5     int i, j, k, count=0; 6     for(i=1; i<=4; i++) 7     { 8         for(j=1; j<=4; j++) 9         {10             for(k=1; k<=4; k++)11             {12                 if(i==j || i==k || j==k)13                     continue;14                 else15                 {16                     //cout<<i*100+j*10+k<<"    ";17                     cout<<i<<j<<k<<"    ";18                     count++;19                     if(count%10==0)20                         cout<<endl;21                 }22             }23         }24     }25     cout<<"sum="<<count<<endl;26     system("pause");27     return 1;28 }

进一步,直接找到符合条件的输出,不符合条件的舍弃,即采用 if 来精简 if…else结构,并对换行符的判断进行简化

 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5     int i, j, k, count=0; 6     for(i=1; i<=4; i++) 7     { 8         for(j=1; j<=4; j++) 9         {10             for(k=1; k<=4; k++)11             {12                 //if(i==j || i==k || j==k)13                 //    continue;14                 //else15                 //{16                 //    //cout<<i*100+j*10+k<<"    ";17                 //    cout<<i<<j<<k<<"    ";18                 //    count++;19                 //    if(count%10==0)20                 //        cout<<endl;21                 //}22                 if(i!=j && i!=k && j!=k)23                 {24                     cout<<i<<j<<k<<"    ";25                     if(++count%10==0)26                         cout<<endl;27                 }28             }29         }30     }31     cout<<"sum="<<count<<endl;32     system("pause");33     return 1;34 }

============================================================== 

【程序2】
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5     int i; 6     cin>>i; 7     if(i<10 && i>=0)    cout<<i*1000<<endl; 8     else if(i<20 && i>=10) cout<<10000+(i-10)*750<<endl; 9     else if(i<40 && i>=20) cout<<10000+7500+(i-20)*500<<endl;10     else if(i<60 && i>=40) cout<<10000+7500+10000+(i-40)*300<<endl;11     else if(i<100 && i>=60) cout<<10000+7500+10000+6000+(i-60)*150<<endl;12     else if(i>=100) cout<<10000+7500+10000+6000+6000+(i-100)*100<<endl;13     else cout<<"error input"<<endl;14     system("pause");15     return 1;16 }

参考代码如下,可读性更高,仅考虑正确输入情况

 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5     int i, bonus1, bonus2, bonus4, bonus6, bonus10, bonus; 6     cin>>i; 7     bonus1=100000*0.1; bonus2=bonus1+100000*0.075; 8     bonus4=bonus2+200000*0.05; bonus6=bonus4+200000*0.03; 9     bonus10=bonus6+400000*0.015;10     if(i<=100000)    bonus=i*0.1;11     else if(i<=200000) bonus=bonus1+(i-100000)*0.075;12     else if(i<=400000) bonus=bonus2+(i-200000)*0.05;13     else if(i<=600000) bonus=bonus4+(i-400000)*0.03;14     else if(i<=1000000) bonus=bonus6+(i-600000)*0.015;15     else bonus=bonus10+(i-1000000)*0.01;16     cout<<bonus<<endl;17     system("pause");18     return 1;19 }

 ==============================================================

【程序3】
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后
的结果满足如下条件,即是结果。请看具体分析:

 1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 int panduan(int i); 5 int main() 6 { 7     int i; 8     for(i=0; i<=100000;i++) 9         if(panduan(i))10             cout<<i<<endl;11     system("pause");12     return 1;13 }14 int panduan(int i)15 {16     int flag1=0,flag2=0;17     float r1=i+100;18     float r2=i+268;19     int max=(int)sqrt(r2)+1;20     for(int j=1; j<max; j++)21     {22         if( fabs((float)(j*j)-r1)<0.0001)23             flag1=1;24         if( fabs((float)(j*j)-r2)<0.0001)25             flag2=1;26     }27     //cout<<flag1<<"    "<<flag2<<endl;28     if(flag1==1 && flag2==1)29         return 1;30     else31         return 0;32 }

参考代码的代码量少且思路独特

 1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 int main() 5 { 6     long int i,x,y,z; 7     for(i=1; i<22; i++) 8     { 9         x=sqrt(i+100);10         y=sqrt(i+296);11         //cout<<"x="<<x<<"    y="<<y<<endl;12         if(x*x==i+100 && y*y==i+268)13             cout<<i<<endl;14     }15     system("pause");16     return 1;17 }

 

 

 

经典算法(1~30)(一)