题目链接:
这道题需要注意的有一下几点:
1. 首先是原数列中的数字出现的次数要与将原数列*2 之后得到的结果数列中出现的次数是相同的,
原本打算写一个出现/不出现 只有两种状态的 appear 数组来表示,但是出错了, 重新看题发现,出现的次数必须要相同,
所以将 appear 状态数组修改成为计数数组
2. 第二点需要注意的就是,在输出结果的时候,无论是满足条件输出 Yes ,还是不满足条件 输出 No,都要加上回车之后再将
计算出来的乘以 2 倍的数列输出
3. 由于数组的长度为 [1,20] 所以,需要使用大数乘法,在字符串的基础之上进行乘法以及进位的数值计算
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
-
int main ( void )
-
{
-
int appear [10] ;
-
char num1[25], num2[25] ;
-
int more = 0 ,len , temp , counter = 0 ;
-
/**
-
more 用来表示进位的数值,在后面当做 bool 类型来使用,用来表示计算出来的数列是否满足题意
-
len 用来存放接收到的字符串的长度, temp 用来存放每次将数列上的数值乘以 2 之后的数值
-
counter 用来存放计算出来的数列的长度
-
*/
-
memset (appear , 0 , sizeof(appear)) ;
-
-
scanf("%s", num1) ;
-
len = strlen(num1) ;
-
-
for ( int i = len -1 ; i >= 0 ; i-- )
-
{
-
appear[num1[i] -'0']++ ;
-
-
temp = (int)(num1[i]-'0')*2 + more ; // temp 数值 = 数列当前位置 i 上的数值 *2 + 进位
-
-
num2[counter++] = (temp % 10)+'0' ;
-
// 将 temp 数值与 10 取余,并将 int 数值修改为 char 类型
-
-
more = temp / 10 ;
-
// more 变量用来存放每次的进位值
-
-
}
-
-
-
if ( more != 0) // 最后需要检查一下最后的进位是否为 0 , 如果不为零,将其置于 num2 数列的最高位
-
num2[counter++] = more + '0';
-
-
more = 0 ; // means that all elements appears in the appear array
-
-
for ( int i = 0 ; i < counter ; i++ )
-
{
-
appear[num2[i]-'0']-- ; // if num2[i] -'0' not appear , appear[..] will < 0
-
-
if ( appear[num2[i]-'0'] < 0 )
-
more = 1 ;
-
-
}
-
-
if ( more == 1 )
-
printf("No\n") ;
-
else
-
printf ("Yes\n") ;
-
-
for ( int j = counter-1 ; j >= 0 ; j-- )
-
printf("%c" , num2[j]) ;
-
-
return 0 ;
-
}
测试点全部通过
阅读(1168) | 评论(0) | 转发(0) |