- 习题2-1 位数(digit)
- //输入一个不超过10^9的正整数,输出它的位数。例如12735的位数是5.
- #include<iostream>
- using namespace std;
- int main()
- {
- int n,i=0;
- cin>>n;
- for(;n>0;)
- {
- n=n/10;
- i++;
- }
- cout<<i<<endl;
- }
- //水仙花数(daffodil)
- //输出100~999中所有的水仙花数。若3位数ABC满足ABC=A^2+B^2+C^2,则称其为水花数
- //例如153=1^3+5^3+3^3,所以153是水仙花数
- #include<iostream>
- using namespace std;
- int main()
- {
- for(int i=100;i<=999;i++)
- {
- int a,b,c;
- a=i/100;
- b=i/10%10;
- c=i%10;
- if(i==(a*a*a+b*b*b+c*c*c))
- cout<<i<<endl;
- }
- return 0;
- }
- //习题2-3 韩信点兵
- //描述 相传韩信才智过人,从不直接清点自己军队的人数,
- //只要让士兵先后以三人一排、五人一排、七人一排地变换队形,
- //而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,
- //表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。
- //已知总人数不小于10,不超过100 。
- #include<iostream>
- using namespace std;
- int main()
- {
- int a,b,c;
- cin>>a>>b>>c;
- for(int n=10;n<=100;n++)
- {
- if(n%3==a &&n%5==b && n%7==c)
- cout<<n<<endl;
- else cout<<"No answer"<<endl;
- }
- return 0;
- }
- //习题2-4 倒三角形(triangle)
- //输入正整数n小于等于20,输出一个n层的倒三角形,例如n=5时输出如下:
- /* #########
- #######
- #####
- ###
- #
- */
- #include<iostream>
- using namespace std;
- int main()
- {
- int n;
- char a='#';
- cin>>n;
- for(int i=n;i>0;i--)//输出n层
- {
- for(int j=n;j>i;j--)//每一层前输出的空格数,第一层没有空格
- cout<<" ";
- for(int k=0;k<2*i-1;k++)//每一层输出#的个数等于2*n-1,因为从下往上#的个数是成等差数列的
- cout<<"#";
- cout<<endl;
- }
- return 0;
- }
- //习题2-5 统计
- //输入一个正整数n,然后读取n个正整数a1,a2,...an,最后在读一个正整数m。
- //统计a1,a2,....,an中有多少个整数的值小于m。
- #include<iostream>
- #include<vector>
- using namespace std;
- int main()
- {
- vector<int> ivec;
- int n,m;
- int a;
- cin>>n;
- while(n--)
- {
- cin>>a;
- ivec.push_back(a);
- }
- cin>>m;
- int count=0;
- for(vector<int>::iterator iter=ivec.begin();
- iter!=ivec.end();iter++)
- {
- if(*iter<m)
- count++;
- }
- cout<<count<<endl;
- return 0;
- }
- //习题2-6 调和级数(harmony)
- //输入正整数n,输出H(n)=1+1/2+1/3+.....+1/n的值,保留3位小数。例如n=3时答案为1.833
- #include<iostream>
- #include<iomanip>
- using namespace std;
- int main()
- {
- double n;
- double sum=0.0;
- cin>>n;
- for(double i=1;i<=n;i++)
- sum+=1/i;
- cout<<setiosflags(ios::fixed)<<setprecision(3)
- <<sum<<endl;
- return 0;
- }
- //习题2-7 近似计算(approximation)
- //计算∏/4=1-1/3+1/5-1/7+......,直到最后一项小于10^-6
- #include<iostream>
- #include<cmath>
- using namespace std;
- int main()
- {
- double pi=1.0; //初始化pi为1
- for(double i=1.0;1/(2*i+1)>=1e-6;i++)//注意循环条件:每个项的分母成等差数列
- //分母跟项的关系就是:(2*i+1)
- {
- pi+=pow(-1,i)*(1/(2*i+1)); //注意:偶数项的时候为负:-1^i
- }
- cout<<pi*4<<endl; //∏/4乘以4就是pi的近似值
- return 0;
- }
- //习题2-8 子序列的和(subsequence)
- //输入两个整数n<m<10^-6,输出1/n^2+1/(n+1)^2+....+1/m^2
- //保留5位小数。例如n=2,m=4时,答案是0.42361;n=65536,m=655360时答案为0.00001.
- #include<iostream>
- #include<iomanip>
- using namespace std;
- int main()
- {
- int n,m;
- double sum=0;
- cin>>n>>m;
- for(double i=n;i<=m;i++)
- sum+=1/(i*i);
- cout<<setiosflags(ios::fixed)<<setprecision(5)<<sum<<endl;
- return 0;
- }
- //习题2-9 分数化小数
- //输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b<=10^6,c<=100.
- //例如:a=1,b=6,c=4时应输出0.1667
- #include<iostream>
- #include<iomanip>
- using namespace std;
- int main()
- {
- double a,b;
- int c;
- double t;
- cin>>a>>b>>c;
- t=a/b;
- cout<<setiosflags(ios::fixed)<<setprecision(c)<<t<<endl;
- return 0;
- }
- //习题2-10 排列(permutation)
- //用1,2,3,....9组成3个三位数abc,def,ghi,每个数字恰好使用一次
- //要求abc:def:ghi=1:2:3.输出所有解。
- #include<stdio.h>
- void result(int num, int& result_add, int& result_mul) //能改变其值,引用
- {
- int i, j, k;
- i = num / 100; //百位
- j = num / 10 % 10; //十位
- k = num % 10; //个位
- result_add += i + j + k; //分解出来的位数相加
- result_mul *= i * j * k; //相乘
- }
- int main()
- {
- int i, j, k;
- int result_add, result_mul;
- for(i = 123; i <=329; i++)
- {
- j = i * 2;
- k = i * 3;
- result_add = 0;
- result_mul = 1;
- result(i, result_add, result_mul);
- result(j, result_add, result_mul);
- result(k, result_add, result_mul);
- if(result_add == 45 && result_mul == 362880)
- printf("%d %d %d\n", i, j, k);
- }
- return 0;
- }
- 未完持续......
刘汝佳/算法竞赛入门经典第二章循环结构程序设计
猜你喜欢
转载自blog.csdn.net/a22222259/article/details/87872755
今日推荐
周排行