Test2-4 个人所得税的计算(if-else-if)
#include
using namespace std;
//个人所得税的计算
int main()
{
float income,taxable,tax;
cout<<"Please input the Monthly Income:";
cin>>income;
taxable=income-3500;
if(taxable<=0) tax=0;
else if(taxable<=1500) tax=taxable*0.03;
else if(taxable<=4500) tax=taxable*0.1-105;
else if(taxable<=9000) tax=taxable*0.2-555;
else if(taxable<=35000) tax=taxable*0.25-1005;
else if(taxable<=55000) tax=taxable*0.3-2755;
else if(taxable<=80000) tax=taxable*0.35-5505;
else tax=taxable*0.45-13505;
cout<<"Tax libility is "< return 0; } Test2-5 今天星期几(switch case) 1>算出year这一年元旦星期几 2>根据mouth和day,计算该日期是year这一年的第几天 #include using namespace std; //计算某天是星期几 int main() { int year,mouth,day,week,d; cout<<"请按年月日的方式输入一个日期:"< cin>>year>>mouth>>day; d = year+(year-1)/4-(year-1)/100+(year-1)/400; week=d%7; d=0; switch(mouth-1) { case 11:d+=30; case 10:d+=31; case 9:d+=30; case 8:d+=31; case 7:d+=31; case 6:d+=30; case 5:d+=31; case 4:d+=30; case 3:d+=31; case 2:d+=28; if(year%4==0 && year%100!=0 || year%400!=0) d++; //判断是否是闰年case 1:d+=31; } d+=day; week=(week+(d-1)%7)%7; if(week==0) cout< else cout< return 0; } Test2-6 找到最小值和最大值(for) #include using namespace std; //找最大数和最小数(循环) int main() { int x,max,min; cout<<"请依次输入5个数(空格隔开):"< cin>>x; //输入一个数 max=min=x; for(int i=2;i<=5;i++) //循环从2开始 { cin>>x; if(max if(min>x) min=x; } cout<<"最大值为MAX="< return 0; } Test2-7 选票统计(switch-case) #include using namespace std; int main() { int sele,zhang,li,wang,nosele,other,num; zhang=li=wang=nosele=other=0; cin>>sele; while(sele!=-1) { switch(sele) { case 1:zhang++;break; //当输入为1时,为zhang投票 case 2:li++;break; //当输入为2时,为li投票 case 3:wang++;break; case 0:nosele++;break; //弃权为0 case 4:other++;break; //无效票(选择人数超过一) default:cout<<"Input Error!"< } cin>>sele; } num=zhang+li+wang+nosele+other; //请问弃权和无效的票算不算其中 float z,l,w; z=zhang/(float)num; l=li/(float)num; w=wang/(float)num; cout<<"zhang:"< cout<<"li:"< cout<<"wang:"< } Test2-8 逆序数(do-while) #include using namespace std; //逆序数的输出(第一个do-while判断是否为非负整数,第二个do-while进行逆序数的转换)int main() { int number,digit; do { cout<<"请输入一个非负整数:"; cin>>number; } while(number<0); cout< do { digit=number%10; number/=10; cout< } while(number>0); cout< return 0; } Test2-9 求出最小爱因斯坦阶梯数-方式1(do-while) #include using namespace std; //判断最小的爱因斯坦阶梯数 int main() { int x=1; do{x++;} while(!(x%2==1 && x%3==2 && x%4==3 && x%5==4 && x%6==5 && x%7==0)); //非常综合的式子 cout<<"爱因斯坦的阶梯数为:"< return 0; } Test2-9-1 求出最小爱因斯坦阶梯数-方式2(while、if-else) #include using namespace std; //判断最小的爱因斯坦及阶梯数-方式2 int main() { int x=7; while(1) { if(x%2==1 && x%3==2 && x%4==3 && x%5==4 && x%6==5 && x%7==0) break; else x+=7; } cout<<"爱因斯坦的阶梯数为:"< return 0; } Test2-10 z字排列的数表,输入一个数,找出改位置的数(for) #include using namespace std; //z字排列的数表,输入一个数,找出改位置的数 int main() { int i,n,k; cin>>n; for(i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout< cout< } for(i=1;i*(i+1)/2 k=n-(i*(i-1)/2); if(i%2!=0) cout< else cout< return 0; } Test2-11 将1元兑换成1分,2分,5分的硬币,共有多少种兑换的方法(for两层)#include using namespace std; //人民币兑换(将1元兑换成1分,2分,5分的硬币,共有多少种兑换的方法) int main() { int five,two,count; count=0; for(five=0;five<=100/5;five++) { for(two=0;two<=(100-5*five)/2;two++) count++; } cout<<"共有"< return 0; } Test2-12 分解质因数(while、if-else) #include using namespace std; //分解质因数 int main() { int n,i; cout<<"Please input a number:"; cin>>n; cout< i=2; while(i { if(n%i==0) { cout< n=n/i; } else i++; } cout< return 0; } Test2-13 10000内完全数的枚举(for) #include #include using namespace std; //求10000以内的完全数(真因子之和为次数本身)int main() { int i,n,s,cnt=0; for(n=2;n<=10000;n++) { s=1; for(i=2;i<=sqrt(n);i++) if(n%i==0) if(i!=n%i) s=s+i+n/i; else s+=i; if(s==n) { cnt++; cout<<"第"< cout< for(i=2;i<=sqrt(n);i++) if(n%i==0) cout<<"+"< cout< } } return 0; } Test2-14 求[100,200]之间质数 #include #include //求[100,200]之间的质数 using namespace std; int main() { int i,k,m,s; for(m=101;m<=200;m=m+2) { k=sqrt(m); s=0; for(i=2;i<=k;i++) if(m%i==0){s=1;break;} if(s==0) cout< } cout< return 0; } *Test2-15 乘积全是1(do-while) #include using namespace std; //键盘输入一个奇数p(末尾不是5),总有一个数t使得p*t=1111 (111) int main() { int p,a,b,r,t,n; while(1) //判断输入的数是否满足要求 { cout<<"输入自然数p,最后一位是3或5或7或9:"< cout<<"p="; cin>>p; if(p%2!=0&&p%5!=0) break; } a=0; n=0; while(a =p的一个全为1的数a { a=a*10+1;n++; } t=0; cout<<"s="; do //此处代码深奥,王细细理解(以p=3为例){ b=a/p; cout< t++; if(t%50==0) cout< r=a % p; a=r * 10+1; n++; } while(r>0); cout< return 0; } *Test2-16 尼科彻斯定理:(for) #include using namespace std; //尼科彻斯定理:任何一个整数的立方都可以表示为一连串连续的奇数之和int main() { int n,num,sum,i,j,flag; cout<<"请输入一个待验证的自然数:"; cin>>n; num = n*n*n; flag=0; for(i=1;i { sum=0; for(j=i;j { sum+=j; if(sum == num) { cout< flag=1; break; } else if(sum > num) break; } } return 0; } Test2-17 末尾0的个数:(for-while) #include using namespace std; //对任意给定的正整数你,求n!中末尾0的个数 int main() { int i,j,k=0,n; cin>>n; for(i=5;i<=n;i=i+5) { j=i; while(j%5==0) { k++; j=j/5; } } cout< return 0; } 递推算法:包括顺推(条件-->结果)和逆推(结果-->条件) Test2-18 走楼梯(for) #include using namespace std; //走楼梯,按照1,2,3的阶梯数走完n个阶梯的方法有多少种。 int main() { int a,b,c,d,i,n; cout<<"请输入楼梯阶数:"; cin>>n; a=1; b=2; c=4; if(n<=0) cout<<"楼梯阶数应为正整数,输入错误!"< else { if(n==1) d=a; else if(n==2) d=b; else if(n==3) d=c; else for(i=4;i<=n;i++) //当阶数>=4时,满足以下条件, { d=a+b+c; a=b; b=c; c=d; } cout<<"走完"< } return 0; } Test2-19 RPG涂色问题 #include using namespace std; //RPG涂色问题:一行n个方格,用红、粉、绿涂色,每个格子一色, //相邻不能同色,首尾不能同色(0 int main() { int i,n,f1,f2,f3,num; cout<<"请输入方格数目n(0 cin>>n; if(n==1) num=3; else if(n==2||n==3) num=6; else { f1=6; f2=6; for(i=4;i<=n;i++) //当n>=4时,会有如下方法 { f3=2*f1+f2; f1=f2; f2=f3; } num=f3; } cout< int j,m,f[31]; f[0]=0; f[1]=3; f[2]=f[3]=6; for(j=4;j<31;j++) f[j]=f[j-1]*2+f[j-2]; cout<<"请输入方格数目m(m<=30):"; cin>>m; cout< return 0; } **Test2-20 马的行走路径 #include using namespace std; //马行走的路径:规则:1.>马走日字;2.>马只能向右走 int main() { int dx[5]={0,2,2,1,1},dy[5]={0,1,-1,2,-2}; struct point { int x;int y; }; point a[51][51]; int i,j,n,m,k; for(i=0;i<51;i++) for(j=0;j<51;j++) a[i][j].x=a[i][j].y=0; cout<<"请输入终点的位置坐标:"; cin>>n>>m; a[n][m].x=-1; //标记为终点 a[n][m].y=-1; for(i=n;i>=2;i--) //倒推 for(j=1;j<=m;j++) if(a[i][j].x!=0) for(k=1;k<=4;k++) { a[i-dx[k]][j-dy[k]].x=i; a[i-dx[k]][j-dy[k]].y=j; } if(a[1][1].x==0) cout<<"No!"< else //存在路径 { i=1; j=1; cout<<"("< while(a[i][j].x!=-1) { k=i; i=a[i][j].x; j=a[k][j].y; cout<<"->("< } } cout< return 0; } Test2-21 储油点 #include using namespace std; //穿过1000km沙漠,储油点的选择 int main() { int k; //储油点位置序号 float d,d1; //d为终点至当前储油点的距离,d1:i=n至始点的距离float oil[10],dis[10]; //dis为各储油点到终点的距离 int i; cout<<"序号\t离出发点距离(km)\t储油量(L)"< k=1; d=500; //从i=1处开始向始点倒推 dis[1]=500; oil[1]=500; //离终点最近的储油点作为递推的开始 do { k+=1; d+=500/(2*k-1); dis[k] = d; oil[k] = oil[k-1]+500; } while (d<1000); //递推结束条件为储油点到终点的距离超过1000 dis[k]=1000; //置始点至终点的距离值 d1=1000-dis[k-1]; //求储油点k处至始点的距离 oil[k] = d1*(2*k+1)+oil[k-1]; //求始点藏油量 for(i=0;i cout< return 0; } *Test2-22 乘火车(看懂看,看不懂算) #include #include using namespace std; //测试数据:10 15 530 #define MAXS 101 int main() { int a,n,m,k,i; int p[MAXS],down[MAXS],up[MAXS]; cout<<"请输入车站数n,始发站上车人数a和终点站下车人数m:"< cin>>n>>a>>m; up[1]=a; down[1]=0; p[1]=a; k=1; do { up[2]=k;down[2]=k;p[2]=p[1]; //枚举第二站的上下车人数和车上人数 for(i=3;i { up[i]=up[i-1]+up[i-2]; down[i]=up[i-1]; p[i]=p[i-1]+up[i-2]; } if(p[n-1]==m) //若n-1站车上人数为m,则输出从各站开出时车上的人数 { up[n]=0; down[n]=m; p[n]=0; cout<<"上车情况如下:"< cout<<"车站编号:"; for(i=1;i<=n;i++) cout< cout< cout<<"上车人数:"; for(i=1;i<=n;i++) cout< cout< cout<<"下车人数:"; for(i=1;i<=n;i++) cout< cout< cout<<"车上人数:"; for(i=1;i<=n;i++) cout< cout< break; } k=k+1; //第二站上车人数增加1 } while(p[n-1] if(p[n-1]>m) cout<<"No Answer!"< return 0; } 迭代法又称为辗转法:不断用变量的旧值推出新值 1.确定迭代变量; 2.建立迭代关系; 3.对迭代进行控制。 Test2-23 验证“谷角猜想”(while) #include using namespace std; //验证“谷角猜想”:一个自然数n,n为偶数/2给n(循环),n为奇数*3+1;//再/2,(循环),总可以得到自然数1 int main() { unsigned int data; cout<<"请输入一个自然数:"; cin>>data; while(data!=1) { if((data%2==0)) { cout< data/=2; cout< } else { cout< data=data*3+1; cout< } } return 0; } Test2-24 埃及分数(分子为1的分数(又叫单位分数)) #include using namespace std; //埃及分数(就是单位分数) //设a、b为互质正整数,且a int main() { int a,b,c; cout<<"请输入给定分数的分子a和分母b:"; cin>>a>>b; cout< while(b%a!=0) { c=b/a+1; cout<<"1/"< a=a*c-b; b=b*c; } cout<<"1/"< return 0; } Test2-25 求平方根 #include #include using namespace std; //求平方根 int main() { double x0,x1,a; cin>>a; x0=a/2; //迭代初值 x1=0.5*(x0+a/x0); do { x0=x1; //为下一次迭代做准备 x1=0.5*(x0+a/x0); } while(fabs(x1-x0)>0.000001); cout< return 0; } Test2-26 迭代求解方程的根 #include #include using namespace std; //迭代法求方程根 int main() { //解法一(二分迭代) double x1,x2,x3; x1=0; x2=2; //初始区间 do { x3=(x1+x2)/2; if((x1*x1*x1-x1-1)*(x3*x3*x3-x3-1)>0) x1=x3; //改变区间 else x2=x3; //改变区间 }while(fabs(x2-x1)>0.000001); //判断是否满足精度要求cout< //解法二(牛顿迭代) double y1,y2; y1=y2=2; //初始点2 do { y1=y2; y2=y1-(y1*y1*y1-y1-1)/(3*y1*y1-1); }while(fabs(y2-y1)>0.000001);//判断是否满足精度要求cout<<"方程的一个根为:"< //解法三(弦截法) double z0,z1,z,f0,f1; z1=0; z=2; do { z0=z1; z1=z; f0=z0*z0*z0-z0-1; f1=z1*z1*z1-z1-1; z=z1-f1/(f1-f0)*(z1-z0); }while(fabs(z-z1)>0.000001); cout<<"方程的一个根为:"< return 0; } Test2-27 水手分椰子(递推和迭代的比较) #include using namespace std; //当然也可以用倒推和迭代的方法(以下为顺推) int main() { int i,k,x,y[7]; k=4; y[1]=k; i=2; while(i<=6) { if((4*y[i-1]-1)%5!=0) { k+=5; y[1]=k; i=2; } else { y[i]=(4*y[i-1]-1)/5; i++; } } x=5*y[1]+1; cout<<"原有的椰子至少"< for(i=1;i<=5;i++) cout<<"第"< cout<<"最后一起分时有椰子"<<5*y[6]+1<<"个,每人分得"< return 0; } 穷举法:举例全部可能情况,逐个判断哪些符合问题的求解(例:test2-9) Test2-28 百钱买百鸡(穷举) #include using namespace std; //百钱买百鸡(公鸡/5,母鸡/3,雏鸡3个/1) int main() { int x,y,z,cnt; cnt=0; for(x=0;x<=100/5;x++) for(y=0;y<=(100-5*x)/3;y++) { z=100-x-y; if(z%3!=0) continue; if(5*x+3*y+z/3==100) { cout< cnt++; } } cout<<"共有买法"< return 0; } Test2-29 水仙花数(穷举) #include using namespace std; //找出(100,1000)之间的水仙花数(n的各位数立方之和=n) int main() { //解法一 int n,a,b,c; for(n=100;n<1000;n++) { a=n/100; b=n/10%10; c=n%10; if(a*a*a+b*b*b+c*c*c==n) cout< } cout< //解法二 for(a=1;a<=9;a++) for(b=0;b<=9;b++) for(c=0;c<=9;c++) { n=100*a+10*b+c; if(a*a*a+b*b*b+c*c*c==n) cout< } cout< return 0; } Test2-30 4位分段和平方数(穷举法) #include #include using namespace std; //四位分段和平方数:例子:2025=(20+25)*(20+25) int main() { //解法一 int a,b,n; cout<<"解法一(穷举法):"; for(n=1000;n<=9999;n++) { a=n/100; b=n%100; if((a+b)*(a+b)==n) cout< }cout< //解法二 int a1,n1,x,y; cout<<"解法二(自己看):"; for(a=(int)sqrt(1000);a<=(int)sqrt(9999);a++) { n1=a*a; x=n1/100; y=n1%100; if(a==x+y) cout< } cout< return 0; } Test2-31 疑案分析(穷举法中的逻辑推理) #include using namespace std; //逻辑推理(01) int main() { int a,b,c,d,e,f,cc1,cc2,cc3,cc4,cc5,cc6,g; for(a=0;a<=1;a++) //for是为了穷举64种情况(2的6次方)for(b=0;b<=1;b++) for(c=0;c<=1;c++) for(d=0;d<=1;d++) for(e=0;e<=1;e++) for(f=0;f<=1;f++) { //满足的判断条件 cc1=a||b; cc2=!(a&&d); cc3=(a&&e)||(a&&f)||(e&&f); cc4=(b&&c)||(!b&&!c); cc5=(c&&!d)||(!c&&d); cc6=d||(!e); /*全部为真*/ if(cc1+cc2+cc3+cc4+cc5+cc6==6) { cout<<"These man are "; if(a==1) cout<<"A "; if(b==1) cout<<"B "; if(c==1) cout<<"C "; if(d==1) cout<<"D "; if(e==1) cout<<"E "; if(f==1) cout<<"F ";cout< /*让有解标志为1*/ g=1; } } if(g!=1) cout<<"Can't found!"< return 0; } Test2-32 比赛预测(穷举法中的逻辑推理) #include using namespace std; //比赛预判 int main() { int a,b,c,d,e,cc1,cc2,cc3,cc4,cc5,g; for(a=1;a<=5;a++) for(b=1;b<=5;b++) for(c=1;c<=5;c++) for(d=1;d<=5;d++) { e=15-(a+b+c+d); //4位选手没取的名次就是e的名次 if(e<1||e>5) continue;//e的名次必须在[1,5] if(a*b*c*d*e!=120) continue;//5位选手的名次必须各不相同 cc1=((b==2)+(a==3))==1; cc2=((b==2)+(e==4))==1; cc3=((c==1)+(d==2))==1; cc4=((c==5)+(d==3))==1; cc5=((e==4)+(a==1))==1; if(cc1+cc2+cc3+cc4+cc5==5)//全部为真 { cout<<"A is "< cout<<"B is "<