《算法竞赛入门经典(第2版)》代码 Chapter 2

算法竞赛QQ群:210838572,一起进步吧!

例题代码

2-1 aabb(7744问题)

// 2-1
#include <stdio.h>
int main()
{
	for(int x = 1; ; x++)
	{
		int n = x*x;
		if(n<1000) continue;
		if(n>9999) break;
		if(n/100%10 == n/1000 && n/10%10 == n%10)
		{
			printf("%d\n", n);
		}
	}
	return 0;
}

2-2 3n+1问题

// 2-2
#include <stdio.h>
int main()
{
	int n;
	int i;
	scanf("%d", &n);
	long long int temp;
	temp = n;
	for(i = 0;;i++)
	{
		if(temp == 1) break;
		if(temp%2 == 1) temp = 3*temp+1;
		else temp /= 2;
	}
	printf("%d\n", i);
	return 0;
}

2-3 近似计算

// t2-3
#include <stdio.h>
int main()
{
	double sum = 0;
	for(int i = 1; ; i++)
	{
		double temp = 1.0/(i*2-1);
		if(i%2 == 1) sum += temp;
		else sum -= temp;
		if(temp < 1e-6) break;
	}
	printf("%.6f\n", sum);
	return 0;
}

2-4 阶乘之和

此代码比书中的代码效率高。

// 2-4
#include <stdio.h>
int main()
{
	int n;
	scanf("%d", &n);
	long long int sum = 0;
	long long int factorial = 1;
	for(int i = 1; i <= n; i++)
	{
		factorial *= i;
		factorial = factorial%1000000;
		sum += factorial;
		sum = sum%1000000;
	}
	int res = sum;
	printf("%d\n", sum);
	return 0;
}

2-5 数据统计

// 2-5
#include <stdio.h>
int main()
{
	int x, n = 0, lit = 2000000000, lar = -2000000000, s = 0;
	while(scanf("%d", &x))
	{
		s += x;
		if(x > lar) lar = x;
		if(x < lit) lit = x;
		n++;
	}
	printf("%d %d %.3f\n", lit, lar, (double)s/n);
	return 0;
}

注:2-6这里就略过啦,它只是用文件输入输出的方式重写了一遍。

习题代码

t2-1 水仙花数(daffodil)

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

t2-2 韩信点兵(hanxin)

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

t2-3 倒三角形(triangle)

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

t2-4 子序列的和(subsequence)

// t2-4
#include <stdio.h>
int main() 
{
	double n, m, tmp, sum = 0;
	int times = 0;
	while(scanf("%lf%lf", &n, &m) && n)
	{
		times++;
		sum = 0;
		for(double i = n; i <= m; i = i + 1.0)
		{
			tmp = 1/i/i;
			sum += tmp;
		}
		printf("Case %d: %.5f\n", times, sum);
	}
	return 0;
}

t2-5 分数化小数(decimal)

这道题我暂时没有找到不使用数组的解决办法,如果谁有好的想法欢迎交流!

// t2-5
#include <stdio.h>
int num[101] = {0};
int main()
{
	long int a, b, c, tmp;
	while(scanf("%d%d%d", &a, &b, &c) && a)
	{
		printf("%d", a/b);
		if(c > 0)
		{
			printf(".");
			tmp = a;
			for(long int i = 1; i <= c+1; i++)
			{
				tmp = tmp*10;
				num[i] = tmp/b;
				tmp = tmp%b;
			}
			if(num[c+1] >= 5)
			{
				num[c]++;
				for(long int i = c; i > 1; i--)
				{
					if(num[i] >= 10)
					{
						num[i-1]++;
						num[i] = 0;
					}
					else
					{
						break;
					}
				}
			}
			for(long int i = 1; i <= c; i++)
			{
				printf("%d", num[i]);
			}
		}
		printf("\n");
	}
	return 0;
}


t2-6 排列(permutation)

此题我看到别人有用数组解决的,但是考虑到这一题放在第二章,就先不使用数组练练手吧。

// t2-6
#include <stdio.h>
int main()
{
	int use[10] = {0};
	for(int a = 1; a <= 9; a++)
	{
		use[a] = 1;
		for(int b = 1; b <= 9; b++)
		{
			if(use[b] == 0)
			{
				use[b] = 1;
				for(int c = 1; c <= 9; c++)
				{
					if(use[c] == 0)
					{
						use[c] = 1;
						for(int d = 1; d <= 9; d++)
						{
							if(use[d] == 0)
							{
								use[d] = 1;
								for(int e = 1; e <= 9; e++)
								{
									if(use[e] == 0)
									{
										use[e] = 1;
										for(int f = 1; f <= 9; f++)
										{
											if(use[f] == 0)
											{
												use[f] = 1;
												for(int g = 1; g <= 9; g++)
												{
													if(use[g] == 0)
													{
														use[g] = 1;
														for(int h = 1; h <= 9; h++)
														{
															if(use[h] == 0)
															{
																use[h] = 1;
																for(int i = 1; i <= 9; i++)
																{
																	if(use[i] == 0)
																	{
																		if(g*100+h*10+i == 3*(a*100+b*10+c) && d*100+e*10+f == 2*(a*100+b*10+c))
																			printf("%d%d%d %d%d%d %d%d%d\n", a, b, c, d, e, f, g, h, i);
																	}
																}
																use[h] = 0;
															}
														}
														use[g] = 0;
													}
												}
												use[f] = 0;
											}
										}
										use[e] = 0;
									}
								}
								use[d] = 0;
							}
						}
						use[c] = 0;
					}
				}
				use[b] = 0;
			}
		}
		use[a] = 0;
	}
	return 0;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值