算法竞赛入门经典 第二章 上机练习(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;
}

	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值