『ACM C++』PTA浙大 | 基础题 - Have Fun with Numbers
连着这两道都是开学前数构老师的“爱心作业”,还没上课开学就给我们布置作业了,这道题有点小坑,也经常遇到类似的问题,特地拿出来记录一下。
------------------------------------------------题目----------------------------------------------------------
Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number consisting exactly the numbers from 1 to 9, only in a different permutation. Check to see the result if we double it again!
Now you are suppose to check if there are more numbers with this property. That is, double a given number with k digits, you are to tell if the resulting number consists of only a permutation of the digits in the original number.
Input Specification:
Each input contains one test case. Each case contains one positive integer with no more than 20 digits.
Output Specification:
For each test case, first print in a line "Yes" if doubling the input number gives a number that consists of only a permutation of the digits in the original number, or "No" if not. Then in the next line, print the doubled number.
Sample Input:
Sample Output:
Yes
------------------------------------------------题目----------------------------------------------------------
(一) 原题大意:
123456789是一个9位数的数字,它完全由1到9之间的数字组成,没有重复。加倍,我们将得到246913578,这恰好是另一个9位数字,由1到9的数字组成,也是没有重复,只是排列不同。
简单来说,就是判断输入的数乘以2之后的结果,且结果的数和输入的书组成数字一致,且出现次数一致,例如1234567899,出现了两次9,翻倍之后2469135798,也出现两次9,则说明该数Yes,符合要求。
(二) 题目分析:
想法一:使用long long int存储输入的数值,然后翻倍,再用分割位数的方法对比输入数和结果数是否一致来判断。
注:这个想法是错误的,也就是我刚刚一开始说的坑点,下面贴上一个表
类型名称 | 字节数 | 取值范围 |
signed char | 1 | -128~+127 (3位) |
short int | 2 | -32768~+32767(5位) |
int | 4 | -2147483648~+2147483647(10位) |
long int | 4 | -2147483648~+2141483647(10位) |
long long int | 8 | -9223372036854775808~+9223372036854775807(19位) |
我们可以清楚的发现long long int 最多只能达到19位,而题目输入要求写了 no more than 20 digits. 不会超过20位,也就是说long long int 存在超范围风险,是不成立的,而且翻倍乘以2之后是存在进位风险的呢。
想法二:既然用整型long long int都不够存的话,这时候就要使用字符串输入处理法了,将输入的每一位数都当成一个字符来处理,通过翻倍和进位来记录。这种方法的难度是在进位处理上,一不小心还是很容易错的。
(三) 代码分块:
想法一的错误代码我先贴上把,这种做法很简单,应该很多人都能想到:
#include<iostream>
#include<cmath>
#include<stdio.h>
using namespace std;
long long int Number;
long long int num,num2,sum = ,sum2 = ,k;
int Oct[];
int Oct2[];
int OK = ;
int main()
{
scanf("%lld",&Number);
num = Number;
num2 = *Number;
while(num>)
{
k = num % ;
Oct[k]++;
sum += k;
num = num / ;
}
while(num2>)
{
k = num2 % ;
Oct2[k]++;
sum2 += k;
num2 = num2 / ;
}
for(int i = ;i<;i++) if(Oct[i] != Oct2[i]) OK = ;
if(OK == )
{
printf("Yes\n");
printf("%lld",*Number);
}
else printf("No\n");
return ;
}
做法就是一个变量存输入数,另一个变量存翻倍数,然后分别分隔,然后再互相对比个数组成是否相同。
下面讲讲想法二AC的代码分块:
首先,先输入数值并获取它的长度:
scanf("%s", num1);
for (i = ; num1[i] == ; i--);
然后再通过对每一位进行翻倍进位:
for ( ; i >= ; i -- )
{
ji = (num1[i] - '') * ; //ji是翻倍后的结果
ans[num1[i] - ''] ++; //ans对原数相应位的个数++
di = ji % ; //*2后的当前位的数字
num2[i] = di + jin + '';
ans[num2[i] - ''] --; //ans对结果数的相应位的个数--
jin = (ji + jin) / ;
}
if (jin != 0) ans[jin] ++;
上面可以形成一个经典的大数计算模板,通过这道题我也开始接触到了一个新的问题的研究中 —— 大数的加减乘除的方法,过几天研究好了贴博客。
第三步就是判断ans是否全部都为0,若是,则说明原数和结果数是相同的排列:
for (i = ; i < ; i++)if (ans[i] != )break;//判断ans是否全部都为0,若是,则说明原数和结果数是相同的排列
if (i == ) printf("Yes");
else puts("No");
if (jin != )printf("%d", jin);
put(num2);
注:这里直接省略了for去输出num2结果数组,而是直接使用puts函数了,这个函数可以直接把数组所有内容直接输出。
(四) AC代码:
#include<stdio.h>
using namespace std;
int ans[];
char num1[];
char num2[];
int i,di = , jin = ,ji = ;
int main()
{
scanf("%s", num1);
for (i = ; num1[i] == ; i--);
for ( ; i >= ; i -- )
{
ji = (num1[i] - '') * ; //ji是翻倍后的结果
ans[num1[i] - ''] ++;//ans对原数相应位的个数++
di = ji % ;//*2后的当前位的数字
num2[i] = di + jin + '';
ans[num2[i] - ''] --;//ans对结果数的相应位的个数--
jin = (ji + jin) / ;
}
if (jin != ) ans[jin] ++;
for (i = ; i < ; i++)if (ans[i] != )break;//判断ans是否全部都为0,若是,则说明原数和结果数是相同的排列
if (i == ) printf("Yes");
else printf("No");
if (jin != )printf("%d", jin);
puts(num2);
return ;
}
(五)AC截图:
(六) 解后分析:
同样是一道练手的基础题,唯一坑点就是对long long int位数认知的模糊,导致一上手就没脑子的long long int,难点在于用char类型去处理数字基础运算,这也为我打开了一个新世界的大门,那就是大数的计算方法,待我整理整理再贴上来。
注:如果有更好的解法,真心希望您能够评论留言贴上您的代码呢~互相帮助互相鼓励才能成长鸭~~
『ACM C++』PTA浙大 | 基础题 - Have Fun with Numbers的更多相关文章
- 『ACM C++』PTA浙大 | 基础题 - 打印沙漏
<数据结构>开课前的一些小作业练习,可能因为一个寒假都没有打C++手生了,整个寒假都在帮拍电影做后期特效,导致这道题居然用了两个钟去AC,深感惭愧,作个标记吧,下面上题. 一首好曲推荐:同 ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 021-024
忙疯警告,这两天可能进度很慢,下午打了一下午训练赛,训练赛的题我就不拿过来的,pta就做了一点点,明天又是满课的一天,所以进度很慢啦~ -------------------------------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 007-011
真的是忙头晕了,学业.ACM打题.班级活动.自学新东西,哇这充实的大学~ ------------------------------------------------L1-007--------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 036-037
这几天比较忙,所以随便做做水题了,得赶紧把英剧搞完啊啊啊啊啊啊 ------------------------------------------------L1-036-------------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 001-006
应师兄要求,在打三月底天梯赛之前要把PTA上面的练习集刷完,所以后面的时间就献给PTA啦~ 后面每天刷的题都会把答案代码贡献出来,如果有好的思路想法也会分享一下~ 欢迎大佬提供更好的高效率算法鸭~ - ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 029-033
哈哈,今天开始我也是学车人了~ 开始一千多道疯狂刷题~ ------------------------------------------------L1-029------------------ ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 025-026
满课一天,做25的时候还疯狂WA,进度可以说是很慢了 哭泣 ------------------------------------------------L1-025---------------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 018-020
终于一周有这么一天能够安静下来好好学习打打题,还是很美滋滋的哈哈~加油加油~ ------------------------------------------------L1-018------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 052-053
今日刷题,水题水题 ------------------------------------------------L1-052------------------------------------ ...
随机推荐
- 使用 JLINK 的 RTT 功能 进行 调试打印数据
jlink V9 时,在 SWD 接口 模式 时 ,要 接 SWO 这个引脚 ,否则导致 在 FreeRTOS的任务中不能使用, 正确的 接线方法 是 VCC,GND,SWDIO,SWCLK,S ...
- 与MySQL的零距离接触
存储引擎 查看数据表的创建命令:show create table tbl_name
- mysql将日期字符串转换
举个例子: 给定字符串为07/31/2018,想要把格式转换成20180731 需要用到以下两个函数: date_format(date,’%Y-%m-%d’) ————–>oracle中的to ...
- Oracle 存储结构一
了解块中表行数据的存储 Oracle数据存储模型 逻辑结构在左,物理结构在右 有一个关系使用虚线绘制,表示段与数据文件的多对多关系.之所以使用虚线表示关系,是因为这种多对多关系不应存在. 表空间实体消 ...
- js怎样得出数组中某个数据最大连续出现的次数
1:js怎样得出数组中某个数据最大连续出现的次数 var test=[1,2,3,3,2,2,2,3,3,3,3,5,3,3,3,3,3] ; var j = 0 ; var max ...
- HTML5 添加视频和音频(响应式视频)
最初的 HTML5规范呼吁所有浏览器内置支持使用 Ogg格式① 直接播放视频或音频(无需插件).但是由于 HTML5工作组的内部争议,曾经作为基线标准的支持 Ogg(包括 Theoravideo 和 ...
- TP框架图片压缩/上传
<-- 在前端的代码 --><form action="{:url('index/user/personal')}" method="post" ...
- hexo博客更换主题
前边我们已经学会了博客的搭建了,这次我们来看看怎么样让我们的博客更漂亮,更个性化.那就是来更换博客的主题,让我们的博客与众不同起来.我们可以去hexo的主题官网去挑选你自己喜欢的主题风格.里边收录了很 ...
- python财经数据接口包Tushare pro的入门及简单使用方式(大数据,股票数据接口)
最近在做一个项目,需要用到股票的数据,我在网上查了很久,最终发现在股票数据上面还是tushare比较专业,而且对于将来做金融行业的大数据这一块的,tushare绝对是你的一个好帮手,所以下面我就简单介 ...
- 【翻译】理解 LSTM 网络
目录 理解 LSTM 网络 递归神经网络 长期依赖性问题 LSTM 网络 LSTM 的核心想法 逐步解析 LSTM 的流程 长短期记忆的变种 结论 鸣谢 本文翻译自 Christopher Olah ...