算法竞赛入门习题第二章

习题2-1 水仙花数(daffodil)
输出100~999中的所有水仙花数。若3位数ABC满足ABC=A3+B3+C3,则称其为水仙花 数。例如153=13+53+33,所以153是水仙花数。
 

#include<stdio.h>
int judge_n(int n)
{
	int a,b,c;
	a=n/100;
	c=n%10;
	b=(n/10)%10;
	if(n==a*a*a+b*b*b+c*c*c)
	return 1;
	return 0;
 } 
int main()
{
	int i=100;
	for(;i<=999;i++)
	{
		if(judge_n(i))
		printf("%d\n",i);
	}	
}

习题2-2 韩信点兵(hanxin)
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人 一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组 数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c< 7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件 结束为止。
样例输入:
2 1 6
2 1 3
样例输出:
Case 1: 41
Case 2: No answer
 

#include<stdio.h>
int main()
{
	int a,b,c,lag=0;
	int i; 
	while(scanf("%d%d%d",&a,&b,&c)==3)
	{
		for(i=10;i<=100;i++)
		{
			if(i%3==a&&i%5==b&&i%7==c)
			{
				lag=1;
				printf("%d\n",i); 
				break;
			} 
		}
		if(lag==0)
		printf("No answer\n");
	}
 } 

习题2-3 倒三角形(triangle)
输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:

#include<stdio.h>
int main()
{
	int n;
	int i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		for(j=0;j<i;j++)
		printf(" ");
		for(j=0;j<2*(n-i)-1;j++)
		printf("#");
		printf("\n");
	}
}

习题2-4 子序列的和(subsequence)
输入两个正整数n<m<106,输出 ,保留5位小数。输入包含多组数据, 结束标记为n=m=0。提示:本题有陷阱。
样例输入:
2 4
65536 655360
0 0
样例输出:
Case 1: 0.42361
Case 2: 0.00001

#include<stdio.h>
int main()
{
	int n,m,i;
	double sum;
	while(scanf("%d%d",&n,&m)==2&&(n||m))
	{
		sum=0;
		for(i=n;i<=m;i++)
		{
			sum+=(1.0/i)*(1.0/i);
		}
		printf("%.5f\n",sum);
    }
}

习题2-5 分数化小数(decimal)
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≤106,c≤100。输 入包含多组数据,结束标记为a=b=c=0。
样例输入:
1 6 4
0 0 0
样例输出:
Case 1: 0.1667
 

#include<stdio.h>
int main()
{
	int a,b,c;
	while(scanf("%d%d%d",&a,&b,&c)==3)
	{
		if(a==0&&b==0&&c==0)
			break;
		printf("%.*f\n",c,a*1.0/b);
	}
	
 } 

习题2-6 排列(permutation)
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必 太动脑筋。
 

#include<stdio.h>
int judge(int n)
{
	int b=n*2;
	int c=n*3;
	int add_result=n%10+(n/10)%10+n/100+b%10+(b/10)%10+b/100+c%10+(c/10)%10+c/100;//45
	int mult_result=(n%10)*((n/10)%10)*(n/100)*(b%10)*((b/10)%10)*(b/100)*(c%10)*((c/10)%10)*(c/100);//362880
	if(add_result==45&&mult_result==362880)
		return 1;
	return 0;
}
int main()
{
	for(int i=123;i<=329;i++)
	{
		if(judge(i))
		printf("%d %d %d\n",i,i*2,i*3);
	}
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值