栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

基础数据结构概述和回形取数,高精度加法,阶乘计算

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基础数据结构概述和回形取数,高精度加法,阶乘计算

 

学前热身 1:阶乘计算

 

 

 

#include 
using 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! 差点踩坑了!

#include 
using 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行关于越界的处理。

#include
using 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             #标

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/468316.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号