高山 发表于 2022-9-23 20:26:22

[C++板块提升计划]奇特的算法(免费)

本帖最后由 高山 于 2022-9-23 20:53 编辑

好久不见,下周1就要发布每周一练啦话不多说,先上正题static/image/hrline/1.gif
题目描述:某个人最近学会了如何把一个数减去1(不准笑),但她貌似不太会“退位”,所以她在减一时是这样操作的:·如果这个数末尾不是0,那么正常减1·否则,就把这个数的个位直接删掉(好有趣的算法)输入两个整数n和k,请你输出那个人的算法,对n进行k次减后得到几?数据范围:2≤n≤109,1≤k≤50样例输入1:512 4样例输出1:50样例输入2:1000000000 9样例输出2:1验证链接:评论区链接:待发布演示视频:评论区链接:待发布C++正式代码:#include<iostream>
using namespace std;
int main()
{
      int n,k;
      cin>>n>>k;
      while(k--)
      {
                if(n%10 == 0)
                {
                        n/=10;
                }
                else
                {
                        n--;
                }
      }
      cout<<n;
      return 0;
}彩色版代码及源代码成品附件:专辑推荐订阅:推荐的帖子:收录鱼C论坛推荐的帖子订阅传送门
每周一练系列:专门发布每周一练(代替发布人也会被收录) 订阅传送门结语:这个帖子我没有收费,也没有回复查看的内容,还发了回帖奖励不为别的,就为一个:求支持!

高山 发表于 2022-9-23 20:28:26

演示视频:待公布
测试连接:待公布
每周一练下篇预告:质数筛(由 zhangjinxuan 周一发布)

zhangjinxuan 发表于 2022-9-23 20:49:22

#include <bits/stdc++.h>

using namespace std;

int main() {
        int n, k;
        scanf("%d%d", &n, &k);
        while (k--) {
                if (n % 10)
                        --n;
                else
                        n /= 10;
        }
        printf("%d", n);
}

人造人 发表于 2022-9-23 21:48:20

#include <iostream>

using std::cin, std::cout, std::endl;

size_t sub(size_t n, size_t k) {
    if(k == 0) return n;
    n = n % 10 == 0 ? n / 10 : n - 1;
    return sub(n, k - 1);
}

int main(void) {
    size_t n, k;
    cin >> n >> k;
    cout << sub(n, k) << endl;
    return 0;
}

高山 发表于 2022-9-23 20:29:22

@zhangjinxuan @hveagle @元豪 @小伤口 求支持!
不够我在@些

雪山之神 发表于 2022-9-23 20:39:29

{:7_146:}

小伤口 发表于 2022-9-23 20:40:28

好有趣的题目,支持支持{:9_236:}

高山 发表于 2022-9-23 20:44:06

小伤口 发表于 2022-9-23 20:40
好有趣的题目,支持支持

感谢

元豪 发表于 2022-9-23 20:44:11

高山 发表于 2022-9-23 20:29
@zhangjinxuan @hveagle @元豪 @小伤口 求支持!
不够我在@些

币币!咳咳,币不币的不重要,关键是我来啦{:5_108:}

高山 发表于 2022-9-23 20:44:43

元豪 发表于 2022-9-23 20:44
币币!咳咳,币不币的不重要,关键是我来啦

这个……

zhangjinxuan 发表于 2022-9-23 20:47:55

Easy!

zhangjinxuan 发表于 2022-9-23 20:52:45

本帖最后由 zhangjinxuan 于 2022-9-23 20:54 编辑

个位删掉,不是各位删掉..

谢谢修改

hornwong 发表于 2022-9-23 22:21:56

{:5_108:}

猫仰唉 发表于 2022-9-23 22:46:34

感谢楼主无私奉献

1molHF 发表于 2022-9-24 07:02:47

{:7_146:}

hveagle 发表于 2022-9-24 07:12:34

某个人最近学会了如何把一个数减去1(不准笑,这里没有笑),但她貌似不太会“退位”,所以她在减一时是这样操作的:
·如果这个数末尾不是0,那么正常减1
·否则,就把这个数的个位直接删掉(好有趣的算法,笑个不停)

hveagle 发表于 2022-9-24 07:14:33

高山 发表于 2022-9-23 20:29
@zhangjinxuan @hveagle @元豪 @小伤口 求支持!
不够我在@些

学生党

cnkizy 发表于 2022-9-24 11:23:20

本帖最后由 cnkizy 于 2022-9-24 11:24 编辑

发里福笑的姿势来了。
#include <stdio.h>

int main() {
    int n, k;
        while (true) {
                scanf_s("%d %d", &n, &k);
                __asm {
                loop_start:
                        cmp dword ptr,0   // k为0则结束循环
                        je loop_end
                        dec        dword ptr   // k = k -1
                        mov eax, dword ptr // 做除法
                        cdq
                        mov ecx, 10
                        idiv ecx
                        push eax         // 保存商
                        test edx, edx    // 判断个位数是否为0
                        je sub_power
                        add esp, 4       // 丢掉商
                        dec dword ptr // n = n - 1
                        jmp loop_start   // 继续循环
                sub_power:
                        pop dword ptr // 余数为0则n为商,n = 商
                        jmp loop_start   // 继续循环
                loop_end:
                }
                printf("%d\n", n);
        }
}
{:10_279:}发里福笑的姿势
页: [1]
查看完整版本: [C++板块提升计划]奇特的算法(免费)