1407241552-ny-九的余数.cpp

本文介绍了一个使用C语言实现的简单程序,该程序能够接收多个字符串输入,并计算每个字符串中所有数字字符的总和再取模9的结果。此外,还介绍了同余定理的基本概念及其在避免整数溢出问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<string.h>
char str[1100000];
int main()
{
 int t;
 int i,j,sum,len;
 scanf("%d",&t);
 while(t--)
 {
  scanf("%s",str);
  len=strlen(str);
  sum=0;
  for(i=0;i<len;i++)
      sum+=(str[i]-'0');
  printf("%d\n",sum%9);
 }
 return 0;
}
      同余定理(中国剩余定理):
   (a+b)%c==(a%c+b%c)%c
   (a*b)%c==((a%c)*(b%c))%c
          若有的数据接近int极限,这样的数运算有可能在过程中超过int范围
    同余定理可以有效的避免这种情况的发生
能否帮我对答案的统计进行完善并给出解释 #include<bits/stdc++.h> using namespace std; const int MAXN = 15; int N, ans1 = 0x3f3f3f3f, ans2 = 0x3f3f3f3f; int a[MAXN][MAXN], now[MAXN][5], dist[MAXN][MAXN], ans[MAXN][5]; int head[MAXN], cnt; struct star{ int nxt, to, w; }edge[MAXN * 4]; void add( int u, int v, int w ){ // cout << u << " " << v << " " << w - 10000 << endl; dist[u][v] = w; dist[v][u] = w; // edge[++ cnt] = { head[u], v, w }; // head[u] = cnt; } //================star_edge int fx1[] = { 2, 1, -2, -1 }; int fy1[] = { 1, 2, -1, -2 }; bool vis[MAXN][MAXN]; void rook(){ for( int i = 1; i <= N; i ++ ){ for( int j = 1; j <= N; j ++ ){ for( int k = 1; k <= N; k ++ ){ add( a[i][j], a[i][k], 10000 ); add( a[i][k], a[i][j], 10000 ); add( a[i][j], a[k][j], 10000 ); add( a[k][j], a[i][j], 10000 ); } } } } void knight( int x, int y, int cnt ){ if( cnt >= N * N ) return ; vis[x][y] = true; for( int i = 0; i < 4; i ++ ){ int nx = fx1[i] + x; int ny = fy1[i] + y; if( nx >= 1 && ny >= 1 && nx <= N && ny <= N && !vis[nx][ny] ){ vis[nx][ny] = true; add( a[x][y] + N * N, a[nx][ny] + N * N, 10000 ); add( a[nx][ny] + N * N, a[x][y] + N * N, 10000 ); knight( nx, ny, cnt + 1 ); vis[nx][ny] = false; } } } void bishop(){ for( int i = 1; i <= N; i ++ ){ for( int j = 1; j <= N; j ++ ){ for( int k = 1; k <= N; k ++ ){ int t = i + j - k; if( t <= 0 || t > N ) continue; add( a[i][j] + N * N * 2, a[k][t] + N * N * 2, 10000 ); add( a[k][t] + N * N * 2, a[i][j] + N * N * 2, 10000 ); } } } } void hebing(){ for( int i = 1; i <= N; i ++ ){ add( i, i + N * N, 10001 ); add( i + N * N, i, 10001 ); add( i, i + N * N * 2, 10001 ); add( i + N * N * 2, i, 10001 ); add( i + N * N, i + N * N * 2, 10001 ); add( i + N * N * 2, i + N * N, 10001 ); } } //================add_edge void floyd(){ for( int k = 1; k <= N; k ++ ){ for( int i = 1; i <= N; i ++ ){ for( int j = 1; j <= N; j ++ ){ dist[i][j] = min( dist[i][j], dist[i][k] + dist[k][j] ); } } } } int main(){ cin >> N; memset( dist, 0x3f, sizeof( dist ) ); for( int i = 1; i <= N; i ++ ){ for( int j = 1; j <= N; j ++ ){ cin >> a[i][j]; now[a[i][j]][1] = i; now[a[i][j]][2] = j; } } rook(); knight( 1, 1, 1 ); bishop(); hebing(); floyd(); for( int i = 1; i <= N * N; i ++ ){ // int x = now[i][1], y = now[i][2]; // cout << dist[x][y] / 10000 << " " << dist[x][y] % 10000 << endl; // ans1 += dist[x][y] / 10000; // ans2 += ans2, dist[x][y] % 10000; } cout << ans1 << " " << ans2; return 0; } ```不要改变变量名、思路和算法,不要使用复杂的变量名,迫不得已使用简短的变量名来创建变量,顺便看看前面的代码有没有问题,如有问题,请修改并且标记出,不要改变原来的结构 题面如下# CF1065D Three Pieces ## 题目描述 你遇到了一种新型的国际象棋谜题。你得到的棋盘不一定是 $8 \times 8$,但它仍然是 $N \times N$ 的。每个格子上都写有一个数字,所有数字都是从 $1$ 到 $N^2$,且两两不同。第 $i$ 行第 $j$ 列的格子上写着数字 $A_{ij}$。 你的棋子只有三种:马、象和车。开始时,你可以任选一种棋子放在数字为 $1$ 的格子上。然后你需要依次到达数字为 $2$ 的格子(过程中可以经过其他格子),再到数字为 $3$ 的格子,依此类推,直到到达数字为 $N^2$ 的格子。每一步你可以选择用当前棋子进行一次合法移动,或者将当前棋子更换为另一种棋子。每个格子可以被多次经过。 马可以移动到横向两格纵向一格,或纵向两格横向一格的格子。象可以沿对角线移动。车可以沿横向或纵向移动。每次移动都必须到达与当前格子不同的格子。 你希望使整个遍历过程的步数最少。在所有步数相同的方案中,你还希望棋子更换次数最少。 你应该采取怎样的路径以满足所有条件? ## 输入格式 第一行包含一个整数 $N$($3 \le N \le 10$),表示棋盘的大小。 接下来的 $N$ 行,每行包含 $N$ 个整数 $A_{i1}, A_{i2}, \dots, A_{iN}$($1 \le A_{ij} \le N^2$),表示棋盘上每个格子上的数字。 保证所有 $A_{ij}$ 两两不同。 ## 输出格式 输出一行,包含两个整数,分别表示最优方案的步数和更换棋子的次数。 ## 输入输出样例 #1 ### 输入 #1 3 1 9 3 8 6 7 4 2 5 ### 输出 #1 12 1 ## 说明/提示 以下是第一个样例的步骤(起始棋子为马): 1. 移动到 $(3, 2)$ 2. 移动到 $(1, 3)$ 3. 移动到 $(3, 2)$ 4. 更换马为车 5. 移动到 $(3, 1)$ 6. 移动到 $(3, 3)$ 7. 移动到 $(3, 2)$ 8. 移动到 $(2, 2)$ 9. 移动到 $(2, 3)$ 10. 移动到 $(2, 1)$ 11. 移动到 $(1, 1)$ 12. 移动到 $(1, 2)$ 由 ChatGPT 4.1 翻译
最新发布
07-23
### 计算10×10棋盘中连通棋子数量的算法 #### 使用深度优先搜索(DFS) 可以通过深度优先搜索(DFS)遍历整个棋盘,标记已经访问过的棋子,并统计连通区域的数量。这种方法简单直观,适合处理此类问题。 ```c #include <stdio.h> #include <stdbool.h> #define SIZE 10 // 定义棋盘大小为10x10 // 方向数组,用于表示上下左右四个方向 const int dx[] = {-1, 1, 0, 0}; const int dy[] = {0, 0, -1, 1}; // DFS 函数,用于标记当前连通区域中的所有棋子 void dfs(char board[SIZE][SIZE], bool visited[SIZE][SIZE], int x, int y) { visited[x][y] = true; // 标记当前位置已访问 // 遍历四个方向 for (int i = 0; i < 4; ++i) { int nx = x + dx[i]; int ny = y + dy[i]; // 检查新位置是否合法且未访问过 if (nx >= 0 && nx < SIZE && ny >= 0 && ny < SIZE && !visited[nx][ny] && board[nx][ny] == '.') { dfs(board, visited, nx, ny); // 继续深搜 } } } int count_eagles(char board[SIZE][SIZE]) { bool visited[SIZE][SIZE] = {false}; // 初始化访问标志矩阵 int eagle_count = 0; // “鹰”的数量计数器 // 遍历整个棋盘 for (int i = 0; i < SIZE; ++i) { for (int j = 0; j < SIZE; ++j) { if (!visited[i][j] && board[i][j] == '.') { dfs(board, visited, i, j); // 发现新的“鹰” eagle_count++; // 增加计数 } } } return eagle_count; } int main() { char board[SIZE][SIZE]; // 定义10x10棋盘 printf("请输入10x10棋盘布局,每行包含10个字符(-.):\n"); // 输入棋盘布局 for (int i = 0; i < SIZE; ++i) { scanf("%s", board[i]); } // 调用函数计算“鹰”的数量 int result = count_eagles(board); printf("棋盘中共有 %d 个‘鹰’。\n", result); return 0; } ``` --- 此代码实现了基于深度优先搜索的方法来统计棋盘上由 `'.'` 表示的己方棋子所构成的连通区域数量[^2]^。通过定义方向数组 `dx` 和 `dy` 来控制移动的方向,确保只在上下左右四个方向进行探索。每次发现一个新的未访问的 `'.'` 棋子时,调用 `dfs` 方法将其所在的连通区域全部标记为已访问,并增加计数器。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值