计蒜客 -- 枚举算法

1.计蒜客 回文数字
题目描述

观察数字:123211232112321,123321123321123321
都有一个共同的特征,就是无论从左到右读还是从右向左读,都是相同的。这样的数字叫做 回文数字。

现在要从5 位或 6 位的十进制数字中找出各个数位之和等于 n 的回文数字。

输入格式

输入一个整数 n(10≤n≤100)。

输出格式

输出所有各个数位之和等于 n 的 5 位和 6 位整数,每个数字占一行,数字按从小到大的顺序排列。如果没有满足条件的数字,则输出 −1。

样例输入

48

样例输出

699996
789987
798897
879978
888888
897798
969969
978879
987789
996699

代码如下

#include<bits/stdc++.h>
using namespace std;
int digit[6];
int n;
bool judge(int x)
{
	int m = 0,sum = 0;
	while(x){
		digit[m++] = x%10;
		sum += x%10;
		x /= 10; 
	}
	if(sum != n) return false;
	for(int i = 0;i<m/2;i++){
		if(digit[i] != digit[m-1-i]){
			return false;
		}
	}
	return true;
}
int main()
{
	bool f = false;
	cin >> n;
	for(int i=10000;i<1000000;i++){
		if(judge(i)){
			cout << i << endl;
			f = true;
		}
	}
	if(!f){
		cout << -1 << endl;
	}
	return 0; 
}

2.蓝桥杯 生日蜡烛
问题描述

某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
从常识来讲一个人的年龄不可能超过200岁

答案: 26
代码如下

#include<bits/stdc++.h>
using namespace std;
int main()
{
	for(int i=1; i<= 200 ;i++){
		int can = 0 ,j = i;
		while(can < 236 && j <= 200){
			can += j;
			j++;
		}
		if(can == 236){
			cout << i << " " << j-1 <<  endl;  //现在某君多大
		}
	}
	return 0; 
}

3.蓝桥杯 奖券数目
问题描述

有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。
请提交该数字(一个整数),不要写任何多余的内容或说明性文字。

**答案:**52488
代码如下

#include<bits/stdc++.h>
using namespace std;
bool judge(int x)
{
	while(x){
		if(x%10==4){
			return true;
		}
		x /= 10;
	}
	return false;
}
int main()
{
	int n,m,cnt = 0;
	cin >> n >> m;
	for(int i=n;i<=m;i++){
		if(!judge(i)){
			cnt++;
		}
	}
	cout << cnt;
	return 0; 
}

4.计蒜客 – 方程的解
在这里插入图片描述
代码如下

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin >> n;
	for(int a = 1; a * a <= n; a++){
		for(int b = a+1; a * a + b * b <= n; b++){
			for(int c = b+1; a * a + b * b + c * c <= n; c++){
				if(a * a + b * b + c * c == n ){
					cout << a << " " << b << " " << c << endl;
				}
			}
		}
	}
	return 0;
}

5.计蒜客 – 四平方和

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多四个正整数的平方和。如果把 00 包括进去,就正好可以表示为四个数的平方和。

比如:

5=0^2+0 ^2+1 ^2+2 ^2

7=1^2+1 ^2+1 ^2+2 ^2

则对于一个给定的正整数 n,可以表示为:
n = a^2 + b^2 + c^2 + d^2

你需要求出 字典序 最小的一组解 a,b,c,d

字典序大小:从左到右依次比较,如果相同则比较下一项,直到有一项不同,较小的一方字典序更小,反之字典序更大,所有项均相同则二者字典序相同。

输入格式

程序输入为一个正整数N(1≤N≤5000000)。

输出格式

输出四个非负整数 a,b,c,d中间用空格分开。

样例输入1

5

样例输出1

0 0 1 2

样例输入2

12

样例输出2

0 2 2 2

代码如下

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,d;
	cin >> n;
	for(int a = 0;a*a <= n; a++){
		for(int b = 0; a*a + b*b <= n; b++){
			for(int c = 0; a*a + b*b + c*c <=n;c++){
				d = sqrt(n - a*a -b*b - c*c);
				if(a*a + b*b + c*c + d*d ==n){
					cout << a << b << c << d << endl;
					return 0;
				}
			}
		}
	}
	return 0;
}
发布了35 篇原创文章 · 获赞 10 · 访问量 1025

猜你喜欢

转载自blog.csdn.net/qq_45475271/article/details/104180569