【汇编语言实战】解素数环问题

简介: 【汇编语言实战】解素数环问题

题目:输入正整数n,把整数1,2,3,…,n组成一个环。

使得相邻两个整数之和均为素数。

输出时从整数1檫始逆时针排列。

同一个环应该恰好输出一次。

C语言描述:


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn =1000;
int vis[maxn];
int A[maxn];
int isp[maxn];
int n;
int ans=0;
int is_prime(int x){
    for( int i=2; i*i<=x; i++ ){
        if(x%i==0) return 0;
    }
    return 1;
}
void dfs(int cur){
    if(cur==n&&isp[A[0]+A[n-1]]){
        ans++;
        for( int i=0; i<n; i++ ) cout<<A[i]<<" ";
        cout<<endl;
    }
    else{
        for(int i=2; i<=n; i++ ){
            if(!vis[i]&&isp[i+A[cur-1]]){
        /*i这个数没被用过,并且符合前后两个数相加为素数的要求*/
                A[cur]=i;/*采用这个数*/
                vis[i]=1;/*设置使用标志*/
                dfs(cur+1);
                vis[i]=0;/*消除标志*//*回溯的本质*/
            }
        }
    }
}
int main(int argc, char const *argv[])
{
    cin>>n;
    memset(vis,0,sizeof(vis));
    for( int i=2; i<=n*2; i++ ) isp[i]=is_prime(i);
    A[0]=1;/*题目中规定从1开始*/
    dfs(1);
    cout<<ans<<endl;
    return 0;
}



汇编语言:


INCLUDE Irvine32.inc
.data
    maxn dd 1000
    vis dd 4000 dup(0)
    A dd 4000 dup(0)
    isp dd 4000 dup(?)
    n dd 10
    ans dd 0
.code
main PROC   
    mov eax,10 ;输入的整数
    mov n,eax
    call initial
    mov edx,offset A
    mov eax,1
    mov [edx],eax
    mov eax,1
    push eax
    call dfs
    mov eax,ans
    call writedec
    exit
main ENDP
dfs PROC
    push ebp
    mov ebp,esp
    pushad
    mov ecx,[ebp+8]     ;ecx:cur
    cmp ecx,n
    jne else_0
    mov edx,offset A    ;edx:A
    mov eax,[edx]       ;eax:A[0]
    mov ebx,n           ;ebx:n
    add eax,[edx+ebx*4-4];eax:A[0]+A[n-1]
    mov edx,offset isp  ;edx:isp
    mov ebx,[edx+eax*4]
    cmp ebx,1
    jne else_0
    push n
    call output
else_0:
    mov esi,2       ;esi:i
for_1:
    cmp esi,n
    jg final
    mov edx,offset vis      ;edx:vis
    mov eax,[edx+esi*4]     ;eax:vis[i]
    cmp eax,0
    jne for_1_end
    mov edx,offset A      ;edx:A
    mov eax,[edx+ecx*4-4]   ;eax:A[cur-1]
    mov edx,offset isp
    add eax,esi
    mov eax,[edx+eax*4]
    cmp eax,1
    jne for_1_end
    mov edx,offset A        ;edx:A
    mov [edx+ecx*4],esi
    mov edx,offset vis
    mov eax,1
    mov [edx+esi*4],eax
    mov eax,ecx
    inc eax
    push eax
    call dfs
    mov edx,offset vis
    mov eax,0
    mov [edx+esi*4],eax
for_1_end:
    inc esi
    jmp for_1
final:
    popad
    pop ebp
    ret 4
dfs ENDP
is_prime PROC
    push ebp
    mov ebp,esp
    sub esp,4
    pushad
    mov ebx,[ebp+8]     ;ebx:x
    mov esi,2           ;esi:i
for_0:
    mov eax,esi
    mul esi
    cmp eax,ebx         ;eax:i^2
    jg val1
    mov eax,ebx         ;eax:x
    mov edx,0
    div esi
    cmp edx,0
    jne for_0_end
    mov eax,0
    mov [ebp-4],eax
    jmp final
for_0_end:
    inc esi
    jmp for_0
val1:
    mov eax,1
    mov [ebp-4],eax
final:
    popad
    mov eax,[ebp-4]
    add esp,4
    pop ebp
    ret 4
is_prime ENDP
initial PROC
    push ebp
    mov ebp,esp
    pushad
    mov esi,2       ;esi:2
    mov edi,n
    mov eax,n
    mul edi
    mov edi,eax     ;edi:n^2
again:
    cmp esi,edi
    jg final
    mov edx, offset isp
    push esi
    call is_prime
    mov [edx+esi*4],eax
    inc esi
    jmp again
final:
    popad
    pop ebp
    ret
initial ENDP
output PROC
    push ebp  
    mov ebp,esp
    pushad
    mov edx, offset A       ;edx:A
    mov edi,[ebp+8]         ;edi:n
    mov esi,0               ;esi:i
again:
    cmp esi,edi
    jge final
    mov eax,[edx+esi*4]
    call writedec
    inc esi
    jmp again
final:
    call crlf
    popad
    pop ebp
    ret 4
output ENDP
END main


运行结果:

目录
相关文章
|
存储 算法 数据库
一起聊聊图像质量和美学评估的数据集
图像质量和美学评估是计算机视觉领域中热点的研究问题,并且极具应用前景,可与众多实际应用深度结合。评价一张图片,主要从两个方向,一个是图像的质量,如像素、清晰度、有无噪声等,一个是图像的感觉,也就是美学,如构图、颜色、内容主体等。通过这两个方面就可以评价一张图片的好坏,通过计算机视觉算法,可以为图片自动评分,得分高的图片被认为较好,可以用于推荐和搜索等应用场景。本文主要聊聊一些关于图像质量和美学评估
13533 1
|
C语言
【汇编语言实战】八皇后问题
【汇编语言实战】八皇后问题
130 2
|
C语言
【汇编语言实战】实现九九乘法表
【汇编语言实战】实现九九乘法表
146 2
|
C语言
【汇编语言实战】实现输出集合{1,2,...,n}全排列
【汇编语言实战】实现输出集合{1,2,...,n}全排列
127 1
|
C语言
【汇编语言实战】二分查找
【汇编语言实战】二分查找
140 1
|
11月前
|
人工智能 API 数据库
Qwen-Agent功能调用实践探索
本文详细解析了Qwen-Agent的核心功能——功能调用,涵盖其定义、工作流程、重要性和实际应用,通过实例展示了如何在Qwen-Agent中利用此功能与外部工具和API互动,扩展AI应用范围。
|
Docker Python 容器
5 分钟,教你用 Docker 部署一个 Python 应用!
5 分钟,教你用 Docker 部署一个 Python 应用!
1184 0
|
C语言
【汇编语言实战】解迷宫问题
【汇编语言实战】解迷宫问题
180 2
|
算法 C语言 网络架构
【汇编语言实战】整数拆分问题
【汇编语言实战】整数拆分问题
159 2
|
C语言
【汇编语言实战】使用插入排序对给定的数组排序(用栈传递参数)
【汇编语言实战】使用插入排序对给定的数组排序(用栈传递参数)
176 1