【汇编语言实战】正整数的素数分解

简介: 【汇编语言实战】正整数的素数分解

示例:72=2^3 * 3^2

C语言描述:


#include <stdio.h>
// 素数分解函数
void primeFactorization(int n) {
    int i;
    printf("%d=", n);
   
    // 循环找出所有因子
    for (i = 2; i <= n; i++) {
        // 如果是质数
        while (n % i == 0) {
            printf("%d", i);
            n /= i;
            if (n != 1) {
                printf("*");
            }
        }
    }
    printf("\n");
}
int main() {
    int num;
   
    // 输入需要分解的正整数
    printf("请输入一个正整数:");
    scanf("%d", &num);
   
    // 调用素数分解函数
    primeFactorization(num);
   
    return 0;
}


汇编语言:

include irvine32.inc
.data
.code
factorNumber proc
    push ebp
    mov ebp,esp
    sub esp,400
    pushad
    mov ebx,eax
    mov ecx,0
    mov [ebp-4],ecx
    mov esi,2
again:
    mov eax,ebx
    mov ecx,2
    mov edx,0
    div ecx
    cmp esi,eax
    jg final_3
    call isprime
    cmp ecx,1
    jne final_2
    call max
final_2:
    add esi,1
    jmp again
final_3:
    call output
    add esp,84
    pop ebp
    popad
    ret 4
factorNumber endp
isprime proc
    mov edi,esi
    cmp edi,1
    je final_0
    mov ecx,2
    mov eax,edi
    mov edx,0
    div ecx
    mov ecx,eax
    mov edi,2
again:    
    cmp edi,ecx
    jg final_1
    mov edx,0
    mov eax,esi
    div edi
    cmp edx,0
    je final_0
    add edi,1
    jmp again
final_0:
    mov ecx,0
    ret
final_1:
    mov ecx,1
    ret
isprime endp
max proc
    mov ecx,0
    mov edx,0
    mov eax,ebx
    div esi
    cmp edx,0
    jne final_5
    add ecx,1
   
again:
    mov edx,0
    div esi
    cmp edx,0
    jne final_6
    add ecx,1
    jmp again
final_6:
    mov edi,1
    add [ebp-4],edi
    mov edi,[ebp-4]
    mov [ebp-4+4*edi],esi
    mov [ebp+4*edi],ecx
    mov edi,1
    add [ebp-4],edi
    ret
final_5:
    ret
max endp
main proc
    call readint
    push eax
    call factorNumber
    exit
main endp
output proc
    mov esi,1
again:    
    cmp esi,[ebp-4]
    jge final_7
    mov eax,[ebp-4+4*esi]
    cmp esi,1
    jne output_1
    call writeint
    mov al,'^'
    call writechar
    mov eax,[ebp+4*esi]
    call writeint
    add esi,2
    jmp again
output_1:
    mov al,'*'
    call writechar
    mov eax,[ebp-4+4*esi]
    call writeint
    mov al,'^'
    call writechar
    mov eax,[ebp+4*esi]
    call writeint
    add esi,2
    jmp again
final_7:
    ret
output endp
end main



运行结果:


目录
相关文章
|
1月前
|
C语言
【汇编语言实战】实现九九乘法表
【汇编语言实战】实现九九乘法表
21 2
|
1月前
|
C语言
【汇编语言实战】实现输出集合{1,2,...,n}全排列
【汇编语言实战】实现输出集合{1,2,...,n}全排列
18 1
|
1月前
|
C语言
【汇编语言实战】给定一个句子,将大写字母变为小写
【汇编语言实战】给定一个句子,将大写字母变为小写
24 1
|
1月前
|
C语言
【汇编语言实战】最小公倍数和最大公约数
【汇编语言实战】最小公倍数和最大公约数
36 1
|
1月前
|
C语言
【汇编语言实战】二分查找
【汇编语言实战】二分查找
14 1
|
1月前
|
C语言
【汇编语言实战】解迷宫问题
【汇编语言实战】解迷宫问题
20 2
|
1月前
|
算法 C语言 网络架构
【汇编语言实战】整数拆分问题
【汇编语言实战】整数拆分问题
20 2
|
1月前
|
C语言
【汇编语言实战】基础知识+函数的引用(求1+2+..+N)+OllyDBG的使用
【汇编语言实战】基础知识+函数的引用(求1+2+..+N)+OllyDBG的使用
11 1
|
1月前
|
C语言
【汇编语言实战】冒泡排序
【汇编语言实战】冒泡排序
24 1
【汇编语言实战】冒泡排序
|
1月前
|
C语言
【汇编语言实战】对给定的数组实现堆排序
【汇编语言实战】对给定的数组实现堆排序
13 1