题目描述
输入一个四个数字组成的整数 n,你的任务是数一数有多少种方法,恰好修改一个数字,把它 变成一个完全平方数(不能把首位修改成 0)。比如 n=7844,有两种方法:3844=622 和 7744=882。
输入
输入第一行为整数 T (1<=T<=1000),即测试数据的组数,以后每行包含一个整数 n (1000<=n<=9999)。
输出
对于每组数据,输出恰好修改一个数字,把 n变成完全平方数的方案数
样例输入 Copy
2 7844 9121
样例输出 Copy
Case 1: 2 Case 2: 0
- #include<algorithm>
- #include <math.h>
- #include<iostream>
- using namespace std;
- bool fun(int x)
- {
- int t = sqrt(x);
- if (t * t == x)
- {
- return true;
- }
- else {
- return false;
- }
-
- }
-
- int main()
- {
- int T, n;
- cin >> T;
- for (int i = 1; i <= T; i++)
- {
- cin >> n;
- int count = 0;
- int a = 10, b = 1, temp;
- for (int j = 1; j <= 4; j++)
- {
- int k = (n % a) / b;
- temp = n - k * b;
- for (int c = 0; c <= 9; c++)
- {
- if (!(c == 0 && j == 4) && (c != k))
- if (fun(temp + c * b))
- ++count;
- }
- a = a * 10; b = b * 10;
- }
- cout << "Case" << " " << i << ":" << " ";
- cout << count << endl;
- }
- }
题目描述
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n以内的自守数的个数。
输入
int型整数。
输出
n以内自守数的数量。
样例输入 Copy
2000
样例输出 Copy
8
- #include<algorithm>
- #include<math.h>
- #include<iostream>
- using namespace std;
- int fun(int num)
- {
- int c = 0;
- while (num)
- {
- num /= 10;
- c++;
- }
- return c;
- }
- int main() {
- int n;
- while (cin >> n)
- {
- if (n >= 100000000)
- cout << 16 << endl;
- else
- {
- int ans = 0;
- for (int i = 0; i <= n; i++)
- {
- int cnt = fun(i);
- int m = pow(10, cnt);
- long long mul = (long long)i * (long long)i;
- if (mul % m == i)
- {
- ans++;
-
- }
- }
- cout << ans << endl;
- }
- }
-
-
- return 0;
- }
题目描述
HNUCM的食堂重新装修了,小明决定约上朋友去食堂相聚,在食堂里,小明看到了M位男同学,N位女同学,小明是一个颜值控,因此他对每一位男生和女生都有一个颜值打分,他心里yy着想为这些单身狗们进行配对,小明真是一个关心同学的人!但小明认为配对同学的颜值之差不能超过5,注意必须是一位男同学和一位女同学才能配对,虽然小明对于可以配对的人数已经有了答案,但他想考考你的编程能力,因此他想请你帮他用编程算一下最多可以配对多少个人。(本题介绍仅作题目背景使用,无任何其他观点)
输入
每个测试文件仅有一条测试数据。
第一行输入M,N,分别表示男同学的数量,女同学的数量。(1<=M<=100,1<=N<=100)
第二行输入M个正整数,分别表示男同学们的颜值。
第三行输入N个正整数,分别表示女同学们的颜值。
注意,所有人的颜值分数范围在[1,100]
输出
输出最多可以配对的总人数。
样例输入 Copy
5 4 10 65 23 67 80 5 15 60 90
样例输出 Copy
4
提示
样例中第一位男同学和第一位女同学配对,第二位男同学和第三位女同学配对。
- #include<iostream>
- #include<algorithm>
- using namespace std;
- struct stu
- {
- int temp;
- int id;
- }a[10005], b[10005];
- int cmp(stu a, stu b)
- {
- return a.temp < b.temp;
- }
- int main()
- {
- int n, m;
- while (~scanf("%d %d", &n, &m))
- {
- for (int i = 0; i < n; i++)
- {
- scanf("%d", &a[i].temp);
- a[i].id = i;
- }
- for (int i = 0; i < m; i++)
- {
- scanf("%d", &b[i].temp);
- b[i].id = i;
- }
- sort(a, a + n, cmp);
- sort(b, b + m, cmp);
- int num = 0;
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- if (abs(a[i].temp - b[j].temp) <= 5 && a[i].id != -1 && b[j].id != -1)
- {
- num++;
- a[i].id = -1;
- b[j].id = -1;
- continue;
- }
- }
- }
- printf("%d\n", num * 2);
- }
- return 0;
- }
题目描述
在5*4的棋盘中,马只能走斜“日”字。马从位置(x, y)处出发,把棋盘的每一格都走一次,且只走一次,请找出所有路径。
输入
x,y,表示马的初始位置。
输出
将每一格都走一次的路径总数,如果不存在该路径则输出“No solution!”。
样例输入 Copy
1 1 2 2
样例输出 Copy
32 No solution!
- #include <stdio.h>
- #include <stdlib.h>
- int A[200][200];
- int n = 5;
- int m = 4;
- int count = 0;
- int fx[8] = { 1,2,2,1,-1,-2,-2,-1 };
- int fy[8] = { 2,1,-1,-2,-2,-1,1,2 };
- int check(int x, int y) {
-
- if (x >= 1 && x <= n && y >= 1 && y <= m && A[x][y] == 0)
-
- return 1;
-
- else return 0;
-
- }
- void solve(int x, int y, int step) {
- int nextx;
- int nexty;
- A[x][y] = step;
- if (n * m == step) count++;
- for (int i = 0; i <= 7; i++)
- {
- nextx = x + fx[i];
- nexty = y + fy[i];
- if (check(nextx, nexty))
- solve(nextx, nexty, step + 1);
-
- }
-
- A[x][y] = 0;
-
- }
-
-
- int main() {
- int x;
- int y;
-
-
- while (~scanf("%d %d", &x, &y)) {
- solve(x, y, 1);
- if (count != 0)
- printf("%d", count);
-
- else {
- printf("No solution!");
- }
- printf("\n");
- count = 0;
- }
- return 0;
-
- }
题目描述
给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色,请输出着色方案。
输入
输入第一行包含n,m,k分别代表n个结点,m条边,k种颜色,接下来m行每行有2个数u,v表示u和v之间有一条无向边,可能出现自环边,所以请忽略自环边。
输出
输出所有不同的着色方案,且按照字典序从小到大输出方案。
样例输入 Copy
3 3 3 1 2 1 3 2 3
样例输出 Copy
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
- #include<stdio.h>
- #include <stdlib.h>
- #include<math.h>
-
- int a[1000][1000];
- int color[1000];
-
- int check(int t, int i) {
- for (int j = 1; j < t; j++) {
- if (a[t][j] == 1 && color[j] == i)
- return 0;
- }
- return 1;
- }
-
-
- void solve(int t, int n, int k) {
- if (t > n) {
- for (int i = 1; i < n + 1; i++)
- printf("%d ", color[i]);
- printf("\n");
- }
- else {
- for (int i = 1; i <= k; i++) {
- if (check(t, i)) {
- color[t] = i;
- solve(t + 1, n, k);
- }
- }
- }
- }
-
- int main()
- {
- int n, m, k;
- while (~(scanf("%d%d%d", &n, &m, &k))) {
- for (int i = 0; i < n + 1; i++) {
- color[i] = 0;
- for (int j = 0; j < n + 1; j++)
- a[i][j] = 0;
- }
- int x, y;
- for (int i = 0; i < m; i++) {
- scanf("%d %d", &x, &y);
- a[x][y] = 1;
- a[y][x] = 1;
- }
- solve(1, n, k);
- }
- return 0;
- }
题目描述
现有1,2,3...,n,要求用这些数组成一个环,使得相邻的两个整数之和均为素数,要求你求出这些可能的环。
输入
输入正整数n。
输出
输出时从整数1开始逆时针输出,同一个环只输出一次,且满足条件的环应按照字典序从小到大输出。
注:每一个环都从1开始。
样例输入 Copy
6
样例输出 Copy
1 4 3 2 5 6 1 6 5 2 3 4
- #include<stdio.h>
- #include <stdlib.h>
- #include<math.h>
- int a[20];
- int used[20];
- int sushu(int n) {
- for (int i = 2; i < n; i++) {
- if (n % i == 0) return 0;
- }
- return 1;
- }
-
- int check(int t, int i, int n) {
- if (used[i] || !sushu(i + a[t - 1])) {
- return 0;
- }
- else {
- if (t == n && !sushu(a[1] + i)) return 0;
- else
- return 1;
- }
- }
-
- void solve(int t, int n) {
- if (t > n) {
- for (int i = 1; i < n + 1; i++)
- printf("%d ", a[i]);
- printf("\n");
- return;
- }
- else {
- for (int i = 2; i <= n; i++) {
- if (check(t, i, n)) {
- used[i] = 1;
- a[t] = i;
- solve(t + 1, n);
- used[i] = 0;
- }
- }
- }
- }
- int main()
- {
- int n;
- while (~(scanf("%d", &n))) {
- for (int i = 1; i < n + 1; i++) {
- a[i] = 0;
- used[i] = 0;
- }
- a[1] = 1;
- used[1] = 1;
- solve(2, n);
- }
- return 0;
- }