“天长地久数”是指一个 K 位正整数 A,其满足条件为:A 的各位数字之和为 m,A+1 的各位数字之和为 n,且 m 与 n 的最大公约数是一个大于 2 的素数。本题就请你找出这些天长地久数。
输入格式:
输入在第一行给出正整数 N(≤5),随后 N 行,每行给出一对 K(3<K<10)和 m(1<m<90),其含义如题面所述。
输出格式:
对每一对输入的 K 和 m,首先在一行中输出 Case X
,其中 X
是输出的编号(从 1 开始);然后一行输出对应的 n 和 A,数字间以空格分隔。如果解不唯一,则每组解占一行,按 n 的递增序输出;若仍不唯一,则按 A 的递增序输出。若解不存在,则在一行中输出 No Solution
。
输入样例:
2
6 45
7 80
输出样例:
Case 1
10 189999
10 279999
10 369999
10 459999
10 549999
10 639999
10 729999
10 819999
10 909999
Case 2
No Solution
C:
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;
int n, k, m;
int cal(int n) {
int sum = 0;
while (n) {
sum = sum + n % 10;
n = n / 10;
}
return sum;
}
bool isprime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
vector<int> v[100];
scanf("%d %d", &k, &m);
printf("Case %d\n", i);
for (int i = pow(10, k - 1) + 99; i <= pow(10, k) - 1; i = i + 100) {
int sum = cal(i);
if (sum == m) {
int sum2 = cal(i + 1);
int com = __gcd(sum2, m);
if (isprime(com) && com > 2) {
v[sum2].push_back(i);
}
}
}
bool flag = 0;
for (int i = 0; i < 100; i++) {
for (int j = 0; j < v[i].size(); j++) {
printf("%d %d\n", i, v[i][j]);
flag = 1;
}
}
if (flag == 0) {
printf("No Solution\n");
}
}
return 0;
}
C++:
#include <bits/stdc++.h>
using namespace std;
int n,k,m;
int cal(int n)
{
int sum=0;
while(n)
{
sum=sum+n%10;
n=n/10;
}
return sum;
}
bool isprime(int n)
{
if(n<=1)
{
return false;
}
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
vector<int> v[100];
scanf("%d %d",&k,&m);
printf("Case %d\n",i);
for(int i=pow(10,k-1)+99;i<=pow(10,k)-1;i=i+100)
{
int sum=cal(i);
if(sum==m)
{
int sum2=cal(i+1);
int com=__gcd(sum2,m);
if(isprime(com)&&com>2)
{
v[sum2].push_back(i);
}
}
}
bool flag=0;
for(int i=0;i<100;i++)
{
for(int j=0;j<v[i].size();j++)
{
printf("%d %d\n",i,v[i][j]);
flag=1;
}
}
if(flag==0)
{
printf("No Solution\n");
}
}
return 0;
}
Java:
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
public class Main {
static int cal(int n) {
int sum = 0;
while (n > 0) {
sum += n % 10;
n /= 10;
}
return sum;
}
static boolean isprime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for (int i = 1; i <= n; i++) {
List<Integer>[] v = new ArrayList[100];
for (int j = 0; j < 100; j++) {
v[j] = new ArrayList<>();
}
int k = scanner.nextInt();
int m = scanner.nextInt();
System.out.println("Case " + i);
for (int x = (int) (Math.pow(10, k - 1) + 99); x <= (int) (Math.pow(10, k) - 1); x += 100) {
int sum = cal(x);
if (sum == m) {
int sum2 = cal(x + 1);
int com = gcd(sum2, m);
if (isprime(com) && com > 2) {
v[sum2].add(x);
}
}
}
boolean flag = false;
for (int x = 0; x < 100; x++) {
for (int j = 0; j < v[x].size(); j++) {
System.out.println(x + " " + v[x].get(j));
flag = true;
}
}
if (!flag) {
System.out.println("No Solution");
}
}
}
static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
}
Python:
import math
def cal(n):
return sum(int(digit) for digit in str(n))
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
n = int(input())
for i in range(1, n + 1):
v = [[] for _ in range(100)]
k, m = map(int, input().split())
print(f"Case {i}")
for x in range(10 ** (k - 1) + 99, 10 ** k, 100):
sum1 = cal(x)
if sum1 == m:
sum2 = cal(x + 1)
com = math.gcd(sum2, m)
if is_prime(com) and com > 2:
v[sum2].append(x)
flag = False
for x in range(100):
for j in range(len(v[x])):
print(f"{x} {v[x][j]}")
flag = True
if not flag:
print("No Solution")