会员
周边
众包
新闻
博问
闪存
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式
...
退出登录
注册
登录
spring学习笔记
算法竞赛入门经典 第二章 上机练习(C++代码)
//习题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<iostream> using namespace std; inline bool haveSame(const int t,const int(&c)[10]) //定义比较函数 { for(int i=0;i<10;++i) { if(t==c[i]) //重复就返回true { return true; } return false;//不同返回false } } int main() { int a(0),b(0),c(0),d(0),e(0),f(0),g(0),h(0),i(0); int compare[10]; //声明数组,用来存放三个三位数的每一个位 for(int j=123;j<330;++j) { //初始化数组 compare[0]=0; compare[1]=0; compare[2]=0; compare[3]=0; compare[4]=0; compare[5]=0; compare[6]=0; compare[7]=0; compare[8]=0; compare[9]=0; a=j/100; //百位 compare[1]=a; b=j/10%10;//十位 if(haveSame(b,compare)) { continue; //跳出并返回循环 } compare[2]=b; c=j%10; //各位 if(haveSame(c,compare)) { continue; } compare[3]=c; int j2=j*2; //def为abc的2倍 d=j2/100; if(haveSame(d,compare)) { continue; } compare[4]=g; e=j2/10%10; if(haveSame(e,compare)) { continue; } compare[5]=e; f=j2%10; if(haveSame(f,compare)) { continue; } compare[6]=f; int j3=j*3; //ghi为abc的3倍 g=j3/100; if(haveSame(g,compare)) { continue; } compare[7]=g; h=j3/10%10; if(haveSame(h,compare)) { continue; } compare[8]=h; i=j3%10; if(haveSame(i,compare)) { continue; } compare[9]=i; cout<<j<<":"<<j2<<":"<<j3<<endl; } return 0; }
posted on
2012-03-27 20:47
spring学习笔记
阅读(
630
) 评论(
0
)
编辑
收藏
举报
会员力量,点亮园子希望
刷新页面
返回顶部
导航
博客园
首页
联系
订阅
管理
公告