TIMUS 1014. Product of Digits

本文介绍了一个算法问题的解决方案,即找到最小的正整数,其各位数字的乘积等于给定的整数N。特别地,文章提供了一段Java代码实现,并讨论了特殊情况,例如当N为0时的正确处理方式。

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

题目如下:
Your task is to find the minimal positive integer number Q so that the product of digits of Q is exactly equal to N.

Input

The input contains the single integer number N (0 ≤ N ≤ 109).

Output

Your program should print to the output the only number Q. If such a number does not exist print −1.

Sample

inputoutput
10
25

 

 

 

题目比较简单,求各位数相乘等于给定数的最小数。 要注意给0的情况,按题意,结果不是0也不是-1,而是10,因为这个错了WE N次。

 

 

代码:

.include "io32.inc" .intel_syntax noprefix .data msg_prompt: .asciz "Enter a decimal digit string (max 20 digits): " msg_max: .asciz "Maximum digit: " msg_min: .asciz "Minimum digit: " msg_sum: .asciz "Sum of digits: " msg_product: .asciz "Product of max and min: " newline: .byte 10, 0 input_buf: .space 22 # 20 digits + newline + null max_digit: .byte 0 min_digit: .byte 0 digit_sum: .long 0 product: .long 0 format_char: .asciz "%c" format_int: .asciz "%d" .text .global _main .extern _printf .extern _fgets .extern _exit _main: # 提示输入 push offset msg_prompt call _printf add esp, 4 # 读取输入 (stdin = 0) push 0 push 21 # 20+1 个字符 push offset input_buf call _fgets add esp, 12 # 处理数字串 push offset input_buf call process_digits add esp, 4 # 输出结果 call output_results # 退出程序 push 0 call _exit # 移除换行符 remove_newline: push ebp mov ebp, esp mov esi, [ebp+8] # 输入缓冲区地址 remove_loop: lodsb test al, al jz end_remove cmp al, 10 # 换行符 jne remove_loop mov byte ptr [esi-1], 0 end_remove: mov esp, ebp pop ebp ret # 处理数字串 (核心算法) process_digits: push ebp mov ebp, esp push esi push ebx mov esi, [ebp+8] # 输入字符串地址 call remove_newline # 清理换行符 # 初始化最小值和最大值 mov byte ptr [min_digit], '9' mov byte ptr [max_digit], '0' mov dword ptr [digit_sum], 0 xor ecx, ecx # 数字计数器 process_loop: mov al, [esi] test al, al jz end_process # 检查数字有效性 (ASCII 48-57) cmp al, '0' jb skip_char cmp al, '9' ja skip_char # 更新最大值: $max = \max(max, current)$ cmp al, [max_digit] jbe check_min mov [max_digit], al check_min: # 更新最小值: $min = \min(min, current)$ cmp al, [min_digit] jae calc_sum mov [min_digit], al calc_sum: # 计算数字和: $\sum digit_i$ sub al, '0' movzx eax, al add [digit_sum], eax inc ecx cmp ecx, 20 # 最多处理20个数字 skip_char: inc esi jmp process_loop end_process: # 计算乘积: $prod = (max - '0') \times (min - '0')$ mov al, [max_digit] sub al, '0' mov bl, [min_digit] sub bl, '0' mul bl mov [product], eax pop ebx pop esi mov esp, ebp pop ebp ret # 输出结果集 output_results: # 最大值 push offset msg_max call _printf add esp, 4 movzx eax, byte ptr [max_digit] push eax call print_char add esp, 4 call print_newline # 最小值 push offset msg_min call _printf add esp, 4 movzx eax, byte ptr [min_digit] push eax call print_char add esp, 4 call print_newline # 数字和 push offset msg_sum call _printf add esp, 4 push dword ptr [digit_sum] call print_number add esp, 4 call print_newline # 乘积 push offset msg_product call _printf add esp, 4 push dword ptr [product] call print_number add esp, 4 jmp print_newline # 链式调用 # 打印字符 print_char: push ebp mov ebp, esp push dword ptr [ebp+8] push offset format_char call _printf add esp, 8 pop ebp ret # 打印整数 print_number: push ebp mov ebp, esp push dword ptr [ebp+8] push offset format_int call _printf add esp, 8 pop ebp ret # 打印换行 print_newline: push offset newline call _printf add esp, 4 ret 加上从键盘输入字符串
06-11
.include "io32.inc" .intel_syntax noprefix .data msg_prompt: .asciz "Enter a decimal digit string (max 20 digits): " msg_prompt_len = . - msg_prompt - 1 msg_max: .asciz "Maximum digit: " msg_max_len = . - msg_max - 1 msg_min: .asciz "Minimum digit: " msg_min_len = . - msg_min - 1 msg_sum: .asciz "Sum of digits: " msg_sum_len = . - msg_sum - 1 msg_product: .asciz "Product of max and min: " msg_product_len = . - msg_product - 1 newline: .byte 10, 0 newline_len = 1 input_buf: .space 22 # 20 digits + newline + null max_digit: .byte 0 min_digit: .byte 0 digit_sum: .long 0 product: .long 0 .text .global _start _start: # 显示输入提示 mov eax, 4 # sys_write mov ebx, 1 # stdout mov ecx, offset msg_prompt mov edx, msg_prompt_len int 0x80 # 读取输入字符串 mov eax, 3 # sys_read mov ebx, 0 # stdin mov ecx, offset input_buf mov edx, 21 # 读取最大21字符 int 0x80 # 移除换行符 push offset input_buf call remove_newline add esp, 4 # 处理数字并计算结果 push offset input_buf call process_digits add esp, 4 # 输出最大数字 mov eax, 4 # sys_write mov ebx, 1 # stdout mov ecx, offset msg_max mov edx, msg_max_len int 0x80 movzx eax, byte ptr [max_digit] push eax call print_char add esp, 4 call print_newline # 输出最小数字 mov eax, 4 # sys_write mov ebx, 1 # stdout mov ecx, offset msg_min mov edx, msg_min_len int 0x80 movzx eax, byte ptr [min_digit] push eax call print_char add esp, 4 call print_newline # 输出数字和 mov eax, 4 # sys_write mov ebx, 1 # stdout mov ecx, offset msg_sum mov edx, msg_sum_len int 0x80 push dword ptr [digit_sum] call print_number add esp, 4 call print_newline # 输出乘积 mov eax, 4 # sys_write mov ebx, 1 # stdout mov ecx, offset msg_product mov edx, msg_product_len int 0x80 push dword ptr [product] call print_number add esp, 4 call print_newline # 退出程序 mov eax, 1 # sys_exit xor ebx, ebx int 0x80 # 子程序:移除换行符 remove_newline: push ebp mov ebp, esp mov esi, [ebp+8] # 输入字符串地址 remove_loop: mov al, [esi] test al, al jz end_remove cmp al, 10 # 换行符ASCII=10 je found_newline inc esi jmp remove_loop found_newline: mov byte ptr [esi], 0 end_remove: pop ebp ret # 子程序:处理数字字符串 process_digits: push ebp mov ebp, esp push esi push ebx mov esi, [ebp+8] # 输入字符串地址 mov dword ptr [digit_sum], 0 # 数字和归零 mov ecx, 0 # 有效数字计数器 # 初始化min_digit为9,max_digit为0 mov byte ptr [min_digit], '9' mov byte ptr [max_digit], '0' process_loop: mov al, [esi] test al, al jz end_process # 检查是否为数字(ASCII 48-57) cmp al, '0' jb next_char cmp al, '9' ja next_char # 更新最小值 cmp al, [min_digit] jae check_max mov [min_digit], al check_max: # 更新最大值 cmp al, [max_digit] jbe update_sum mov [max_digit], al update_sum: # 累加数字和 sub al, '0' # 字符转数字 movzx eax, al add [digit_sum], eax inc ecx # 检查是否超过20个数字 cmp ecx, 20 jae end_process next_char: inc esi jmp process_loop end_process: # 计算乘积:max × min mov al, [max_digit] sub al, '0' mov bl, [min_digit] sub bl, '0' mul bl mov [product], eax pop ebx pop esi pop ebp ret # 子程序:打印字符 print_char: push ebp mov ebp, esp sub esp, 4 # 为局部变量分配空间 # 将字符存入局部变量 mov al, byte ptr [ebp+8] mov byte ptr [ebp-4], al # 系统调用输出字符 mov eax, 4 # sys_write mov ebx, 1 # stdout lea ecx, [ebp-4] # 字符地址 mov edx, 1 # 输出长度=1 int 0x80 add esp, 4 # 清理栈空间 pop ebp ret # 子程序:打印换行 print_newline: mov eax, 4 # sys_write mov ebx, 1 # stdout mov ecx, offset newline mov edx, newline_len int 0x80 ret # 子程序:打印数字(递归实现) print_number: push ebp mov ebp, esp mov eax, [ebp+8] # 获取数字 # 处理0特殊情况 test eax, eax jnz not_zero push '0' call print_char add esp, 4 jmp end_print not_zero: # 递归打印高位数字 xor edx, edx mov ecx, 10 div ecx # eax=商, edx=余数 test eax, eax jz skip_recursion push eax call print_number add esp, 4 skip_recursion: # 打印当前位 add edx, '0' push edx call print_char add esp, 4 end_print: pop ebp ret 修改代码
06-11
内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值