学前热身 1:阶乘计算
#includeusing namespace std; int A[10000] = {0}; //存结果,注意大的静态数组要定义在全局 int main(){ int n; cin >> n; A[0] = 1; for(int i = 1;i <= n;i++){ int carry = 0; //进位 for(int j = 0;j < 10000;j++){ A[j] = A[j] * i + carry; carry = A[j] / 10; A[j] = A[j] % 10; } } int last; for(int i = 10000 - 1;i >= 0;i--){ if (A[i] != 0){ last = i; break; } } for(int i = last; i >= 0;i--) cout << A[i]; return 0; }
解题思路 — Java
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
int n = in.nextInt();
BigInteger s = new BigInteger("1");
for(int i = n; i >= 1; i--)
s = s.multiply(new BigInteger(String.valueOf(i)));
System.out.println(s);
}
}
}
解题思路 — Python
N = int(input())
ans = 1
for i in range(1, N+1):
ans *= i
print(ans)
学前热身2:高精度加法
题目描述
输入两个整数 a 和 b,输出这两个整数的和。a 和 b都不超过 100 位。
解题思路
C++:
萌新: 这题也是个高精度问题,做法应该和上一道差不多,也是用数组模拟小学加法。我感觉它对我而言已经没有难度了。
大佬: 是的,但你要注意,因为输入的数可能很大,所以你不能以数字的形式读入,只能按字符读入。
萌新: oh my god! 差点踩坑了!
#includeusing namespace std; string add(string a,string b){ string s; //存结果 int c = 0; //进位 for(int i = a.size()-1,j = b.size()-1;i >= 0||j >= 0||c > 0;i--,j--){ if(i>=0) c += a[i]-'0'; if(j>=0) c += b[j]-'0'; s += (c%10)+'0'; c /= 10; } reverse(s.begin(),s.end()); return s; } int main(){ string A,B; cin >> A >> B; cout << add(A, B); return 0; }
Java:
萌新:大佬,用 Java 有什么坑点吗?
大佬:你就放心用吧,能有问题算我输...
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
BigInteger a = new BigInteger(sc.next());
BigInteger b = new BigInteger(sc.next());
System.out.println(a.add(b));
}
}
Python:
萌新&大佬: 用Python写大数,代码简单得令人发指啊!
a = int(input()) b = int(input()) print(a+b)
学前热身3:回形取数
题目描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
解题思路
二维数组
C++:
大佬: 本题能稍稍考验一下你编码是否细心。对于上下左右4个方向,我的代码分别写了4次,比较啰嗦。后面Java和Python代码的写法更简洁一些。注意第16行关于越界的处理。
#includeusing namespace std; int a[201][201]; //存矩阵 int vis[201][201]; //标记这个坐标的点是否已经取过 int main(){ int n,m; cin >> n >> m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin >> a[i][j]; int x=1, y=1; cout << a[1][1]; vis[1][1] = 1; //标记这个坐标点已经取过 int sum = 1; while(sum < n*m){ //下面分别处理上、下、左、右四个方向 while(x+1<=n && vis[x+1][y]==0){ cout << " " << a[++x][y] ; vis[x][y]=1; sum++; } while(y+1<=m && vis[x][y+1]==0){ cout << " " << a[x][++y] ; vis[x][y]=1; sum++; } while(x-1>=1 && vis[x-1][y]==0){ cout << " " << a[--x][y] ; vis[x][y]=1; sum++; } while(y-1>=1 && vis[x][y-1]==0){ cout << " " << a[x][--y] ; vis[x][y] = 1; sum++; } } return 0; }
Java:
大佬: 学学如何用Java处理二维数组。对于上下左右44个方向,我直接用第33行的数组dirdir表示。
import java.util.Scanner;
public class Main {
static int[][] dir = new int[][] {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt(), n = sc.nextInt();
int[][] a = new int[m][n];
for(int i=0; i=m || ny>=n || a[nx][ny]==-1) {
d = (d+1)%4;
x = x+dir[d][0];
y = y+dir[d][1];
}else {
x = nx;
y = ny;
}
System.out.print(a[x][y]+" ");
a[x][y] = -1; //标记这个坐标点已经取过
}
}
Python
大佬: 我用Python把上面的Java代码改写了一遍。Python的代码简短很多。
萌新: Python,永远滴神!
dir = [(1, 0), (0, 1), (-1, 0), (0, -1)] #4个方向
m, n = map(int, input().split())
a = []
for i in range(m):
a.append(input().split())
x, y = -1, 0
d = 0
sum = 0
while sum < m*n:
sum = sum + 1
nx, ny = x + dir[d][0], y + dir[d][1]
if nx < 0 or nx >= m or ny < 0 or ny >= n or a[nx][ny]==-1:
d = (d + 1) % 4
x, y = x + dir[d][0], y + dir[d][1]
else:
x, y = nx, ny
print(a[x][y], end=' ')
a[x][y] = -1 #标



