鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 高山

[技术交流] C++算法:每位数的提取【回复可见、抢楼】

 关闭 [复制链接]
抢楼 抢楼 查看抢中楼层 本帖为抢楼帖,欢迎抢楼!  截止楼层:10000  奖励楼层: 11,22,33,66,77,88,99,111,222,333,555,666,777,888,999,1111,2222,3333,*,*,*,*,*,*,*,*,*,*,*,*,*,* 
发表于 2022-9-19 20:57:00 | 显示全部楼层
本帖最后由 cnkizy 于 2022-9-19 20:59 编辑

微信截图_20220919205511.png
微信截图_20220919205614.png
  1. #include <stdio.h>
  2. // num 表示需要计算的数           [ebp + 8]
  3. // buff 表示取出的数字存放的数组  [ebp + 12]
  4. // len 表示数组长度               [ebp + 16]
  5. void _stdcall fun_asm(unsigned int num, char* buff, int* len) {
  6.     __asm {
  7.         push 10    // 创建一个局部变量,10,作为除数,地址为[esp]
  8.         mov ecx, [num]
  9.         loop_start :
  10.         cmp ecx, 0
  11.         jz loop_over  // 被除数为0停止
  12.         // 计算
  13.         mov eax,ecx
  14.         cdq
  15.         idiv dword ptr[esp] // 32位/32位,除法结果: eax存放商,edx存放余, 这样一个指令就完成了俩值计算
  16.         mov ecx, eax  // 商给ecx
  17.         mov ebx, [buff]   // edx余数给buff
  18.         mov dword ptr[ebx], edx  
  19.         inc buff     // buff地址往后+1
  20.         mov ebx, [len]   // len+1
  21.         inc[ebx]      
  22.         jmp loop_start // 返回继续计算,直到被除数为0停止
  23.         loop_over :
  24.         add esp, 4  // 平衡栈,之前创建了局部变量,现在不用了需要扔掉
  25.     }
  26. }

  27. int main() {
  28.     char* arry = new char[10] {0}; // 只有10个数字
  29.     int len = 0; // 实际使用了多少数字
  30.     int num = 0; // 输入的数字
  31.     while (true) {
  32.         printf("请输入被计算的数字:");
  33.         scanf_s("%d", &num);
  34.         if (num == 0) break;
  35.         fun_asm(num, arry, &len);
  36.         for (int i = len - 1; i >= 0; i--) {
  37.             printf("%d ", *(arry + i));
  38.         }
  39.         printf("\n");
  40.         len = 0;
  41.     }
  42.     delete[] arry;
  43.     return 0;
  44. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-19 20:59:41 | 显示全部楼层
抢到了22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-19 22:04:33 | 显示全部楼层
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. string num;

  4. int main(){
  5.     ios::sync_with_stdio(0);
  6.     cin.tie(0); cout.tie(0);
  7.    
  8.     cin >> num;

  9.     for(auto number : num){
  10.         cout << number << " ";
  11.     }
  12.    
  13.     return 0;
  14. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-19 22:11:40 | 显示全部楼层
sshot-1.png
做成了一个任意7位数以内,取得各位数单的类型版本,需要输出哪一位,就可以输出哪一位: a.out(4);//要第4位数子.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-19 22:18:07 | 显示全部楼层

fun_asm中是用了mov?
汇编手段吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-20 06:58:43 From FishC Mobile | 显示全部楼层
柿子饼同学 发表于 2022-9-19 22:04

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-20 07:50:41 | 显示全部楼层
howzyao 发表于 2022-9-19 22:18
fun_asm中是用了mov?
汇编手段吗?

是的,混合编程挺好玩,坑挺多的,跟着小甲鱼学汇编,来玩呀。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 06:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表