长度为 2×n 的正整数,如果左边 n 个数字之和=右边 n 个数字之和
时间: 2023-05-24 11:04:30 浏览: 54
这样的正整数称为“幸运数”。
例如,1230 是一个幸运数,因为左边两个数之和为 1+2=3,右边两个数之和为 3+0=3。
又例如,1024 不是一个幸运数,因为左边两个数之和为 1+0=1,右边两个数之和为 2+4=6。
相关问题
输入一个正整数 n,求它的位数及其各位数字之和。
算法1:
1. 求出 n 的位数,可以通过循环除以 10 直到商为 0 来实现。
2. 求出 n 的各位数字之和,可以通过循环取模和除以 10 来实现。
时间复杂度:O(logn)
C++ 代码:
```cpp
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int cnt = 0, sum = 0;
while (n) {
cnt++;
sum += n % 10;
n /= 10;
}
cout << "位数:" << cnt << endl;
cout << "各位数字之和:" << sum << endl;
return 0;
}
```
算法2:
1. 将 n 转换成字符串。
2. 求出字符串的长度和各位数字之和。
时间复杂度:O(logn)
C++ 代码:
```cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
cin >> n;
string s = to_string(n);
int cnt = s.size(), sum = 0;
for (char c : s) {
sum += c - '0';
}
cout << "位数:" << cnt << endl;
cout << "各位数字之和:" << sum << endl;
return 0;
}
```
长度为 2×n 的正整数,如果左边 n 个数字之和=右边 n 个数字之和,那么我 们称之为“幸运号码”。例如 99,1230 就是幸运号码。下面给出正整数n,求出 长度为 2×n 的幸运号码的总数,注意这里的幸运号码不能包含前导 0。 给出C++代码
```c
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
long long ans = 0;
for (int i = 1; i <= 9; i++) {
for (int j = i; j <= 9; j++) {
if ((i + j) % 2 != 0) continue; // 左右两边的数字和必须是偶数
int k = n - 1;
int sum = (i + j) / 2;
for (int t = 1; t < k; t++) {
sum += 9; // 每个空位都可以填 1~9 任意数字
}
if (sum > 9) continue; // 如果 sum 大于 9,说明左右两边的数字和最多只能为 18,不符合题意
if (sum < i || sum < j) continue; // 左边和右边的数字都必须小于等于 sum
if (k == 1 && i == j && i == sum) continue; // 特殊情况:长度为 2 的幸运号码只有一种,即两个数字相等且等于它们的和
if (k == 1) {
ans++; // 长度为 2 的幸运号码有多种,直接累加
} else {
ans += 2; // 长度>2 的幸运号码必然有两种(左右数字交换),直接乘以 2 累加
}
}
}
printf("%lld\n", ans);
return 0;
}
```