当前位置: 首页 > article >正文

PAT甲级-1023 Have Fun with Numbers

题目

题目大意

一个数乘以2倍后,仍由原来的数字组成,只不过顺序发生变化,就输出Yes,否则输出No。并输出乘以2部后的数。

思路

题目说数字不超过20位,long long最多只能表示19位,93....,超过其范围。求2倍,则为大数加法。因此用字符串存数字。因为每次进位最多只能进一位,所以可以用isadd表示是否产生进位,从最低位开始计算。最后将计算结果用reverse翻转即可。比较两个字符串所含字符是否一致,可以for循环一位位比较,确认一位就删除一位,循环后验证该字符串是否为空,如果为空,则说明一致。也可以用sort排序,然后比较是否相等,不过要放到vector数组中,比较麻烦。

注意计算首位加法,如果进位,就跳出了for循环,所以要再循环外放一个isadd的if语句,如果进位,res再加‘1’。测试点2和测试点7考察的就是这个地方。

代码

#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
using namespace std;

int main(){
    string s;
    cin >> s;
    string res = "";
    bool isadd = false;
    for (int i = (int)s.size() - 1; i >= 0; i--){
        if (isadd){
            res += ((s[i] - '0') * 2 + 1) % 10 + '0';
        }else{
            res += (s[i] - '0') * 2 % 10 + '0';
        }
        if (s[i] - '0' >= 5){
            isadd = true;
        }else{
            isadd = false;
        }
    }
    if (isadd) res += '1';  // 注意首位进位,测试点2和测试点7

    string res2 = res;
    reverse(res2.begin(), res2.end());
    for (int i = 0; i < (int)s.size(); i++){
        if (res.find(s[i]) != -1){
            res.erase(res.find(s[i]), 1);
        }
    }
    if (res == ""){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }
    cout << res2 << endl;

    return 0;
}


http://www.kler.cn/a/519655.html

相关文章:

  • JVM常见知识点
  • IOS 自定义代理协议Delegate
  • 页高速缓存与缓冲区缓存的应用差异
  • YOLOv9改进,YOLOv9检测头融合ASFF(自适应空间特征融合),全网首发
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.1 从零搭建NumPy环境:安装指南与初体验
  • 【Docker】ubuntu中 Docker的使用
  • 面向长文本的多模型协作摘要架构:多LLM文本摘要方法
  • MyBatis框架基础学习(1)
  • 低代码系统-产品架构案例介绍、轻流(九)
  • 亚博microros小车-原生ubuntu支持系列:10-画笔
  • 【架构面试】三、高可用高性能架构设计
  • Gradle自定义任务指南 —— 释放构建脚本的无限可能
  • 解读2025年生物医药创新技术:展览会与论坛的重要性
  • 即梦(Dreamina)技术浅析(一)
  • 自动驾驶中的多传感器时间同步
  • 【自定义函数】编码-查询-匹配
  • python爬虫 爬取站长素材 (图片)(自学6)
  • Pyecharts之词云图、面积图与堆叠面积图
  • 一文讲解Java中的重载、重写及里氏替换原则
  • uniapp商城项目之商品详情