首页 > 代码库 > 经典算法(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)(一)