//习题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;
}