IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 欧拉计划 31~40 -> 正文阅读

[数据结构与算法]欧拉计划 31~40

硬币求和

#include <bits/stdc++.h>
using namespace std;

int a[10] = {1, 2, 5, 10, 20, 50, 100, 200}, n = 8;
int f[209], m = 200;

int main() {
	f[0] = 1;
	for (int i = 0; i < n; i ++) {
		for (int j = a[i]; j <= m; j ++) {
			f[j] += f[j - a[i]];
		}
	}
	cout << f[m];

	return 0;
}

全数字的乘积

#include <bits/stdc++.h>
using namespace std;

int f[10000];	//f[k]==true表示k已经作为乘积出现过了 

bool fun(int a, int b) {
	int c = a * b;
	
	int h[10] = {1};	//出现0,返回false 
	while (a) {
		int t = a % 10;
		if (h[t]) return false;
		h[a % 10] = 1;
		a /= 10;
	}
	while (b) {
		int t = b % 10;
		if (h[t]) return false;
		h[b % 10] = 1;
		b /= 10;
	}
	
	while (c) {
		int t = c % 10;
		if (h[t]) return false;
		h[c % 10] = 1;
		c /= 10;
	}
	
	return true;
}

int main() {
	int ans = 0;
	for (int i = 1; i <= 9; i ++) {
		for (int j = 1000; j <= 9999; j ++) {
			if (fun(i, j)) {
				if (f[i * j] == 0) {
					ans += i * j;
					f[i * j] = 1;
				}
			}
		}
	}

	for (int i = 10; i <= 99; i ++) {
		for (int j = 100; j <= 999; j ++) {
			if (fun(i, j)) {
				if (f[i * j] == 0) {
					ans += i * j;
					f[i * j] = 1;
				}
			}
		}
	}
	
	cout << ans;

	return 0;
}


/*
1位 * 1位 = 7位 不成立

1位 * 2位 = 6位 不成立 

1位 * 3位 = 5位 不成立
2位 * 2位 = 5位 不成立

1位 * 4位 = 4位 成立
2位 * 3位 = 4位 成立

1位 * 5位 = 3位 不成立
2位 * 4位 = 3位 不成立
3位 * 3位 = 3位 不成立

*/

消去数字的分数

#include <bits/stdc++.h>
using namespace std;

int gcd(int x, int y) {
	return y == 0 ? x : gcd(y, x % y);
}

int main() {
	int a = 1, b = 1;							//最后的分子与分母 
	for (int i = 1; i < 10; i ++) {				//不考虑0,因为含有0的情况是平凡解
		for (int j = 1; j < 9; j ++) {
			for (int k = j + 1; k < 10; k ++) {	//j 一定小于 k 
				int u, d;						//分子,分母 
				
				u = 10 * j + i;
				d = 10 * i + k;
				if (u * k == d * j) {
					a *= u;
					b *= d; 
				}
				
				u = 10 * i + j;
				d = 10 * k + i;				
				if (u * k == d * j) {
					a *= u;
					b *= d;
				}
			}
		}
	}
	
	int t = gcd(a, b);
	cout << b / t; 

	return 0;
}

/*
(10*j + i) / (10*k + i) = j / k, 推出k = j, 舍
(10*i + j) / (10*i + k) = j / k, 推出k = j, 舍 

只考虑以下两种情况 

ji   j
-- = -
ik   k

ij   j
-- = -
ki   k
 
*/

各位数字的阶乘

#include <bits/stdc++.h>
using namespace std;

const int N = 3e6;
int f[10] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
int a[N + 9];

int main() {
	int sum = 0;
	for (int i = 1; i <= N; i ++) {
		a[i] = a[i / 10] + f[i % 10];
		if (a[i] == i) {
			sum += i;
		}
	}
	cout << sum - 1 - 2;

	return 0;
}

/*
6位数最大:362880 * 6 = 2177280 
7位数最大:362880 * 7 = 2540160
8位数最大:362880 * 8 = 2903040
*/

圆周素数

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6;
bool a[N + 9];
int p[N], n;
int b[4] = {1, 3, 7, 9}, cnt;
int base[7] = {-1, 1, 10, 100, 1000, 10000, 100000};

void dfs(int x, int pos) {
	if (pos > 6) return;
	
	for (int i = 0; i < 4; i ++) {
		int num = x * 10 + b[i], t = num;
		
		bool flag = true;
		for (int j = 1; j <= pos; j ++) {
			if (a[t]) {
				flag = false;
				break;
			}
			t = t % 10 * base[pos] + t / 10;
		}
		if (flag) cnt ++;
		
		dfs(num, pos + 1);
	}
}

int main() {
	a[1] = true;
	for (int i = 2; i * i <= N; i ++) {
		if (!a[i]) {
			for (int j = i * i; j <= N; j += i) {
				a[j] = true;
			}
		}
	}
	
	dfs(0, 1);
	
	cout << cnt + 2;	//两个特殊数2和5 

	return 0;
}

双进制回文数

#include <bits/stdc++.h>
using namespace std;

int a[100000], n, ans;

int main() {
	for (int i = 1; i <= 9; i ++) {
		a[++ n] = i;
		a[++ n] = i * 11;
	}
	
	for (int i = 10; i < 100; i ++) {
		a[++ n] = i * 10 + i / 10;
		a[++ n] = i * 100 + i % 10 * 10 + i / 10;
	}

	for (int i = 100; i < 1000; i ++) {
		a[++ n] = i * 100 + i / 10 % 10 * 10 + i / 100;
		a[++ n] = i * 1000 + i % 10 * 100 + i / 10 % 10 * 10 + i / 100;
	}

	for (int i = 1; i <= n; i ++) {
		int t = a[i];
		int len = log2(t) + 1;
		
		bool flag = true;
		
		for (int j = 0, k = len - 1; j < k; j ++, k --) {
			if ((t >> j & 1) != (t >> k & 1)) {
				flag = false;
				break;
			}
		}
		
		if (flag) ans += t;
	}
	cout << ans;

	return 0;
}


/*
1位数:9
2位数:9
3位数:90
4位数:90
5位数:900
6位数:900 
*/
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:37:25  更:2022-05-12 16:38:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:34:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码