题目描述:输入一个长度不超过20位的数字,数字位数由0~9组成,将这个数字加倍,得到的一个新的数字,若这个新的数字是由原来数字所包含的数字经排列组合得到的,则第一行输出“Yes”;第二行输出加倍后的数字;若这个新的数字含有原数字没有的数字或数量增加,则第一行输出“No”,第二行输出加倍后的数字。
Sample Input:
1234567899
Sample Output:
Yes
2469135798
做题笔记:
1)关于整数类型储存数据长度的问题
类型名称 字节数 取值范围
signed char 1 -128~+127
short int 2 -32768~+32767
int 4 -2147483648~+2147483647
long int 4 -2147483648~+2141483647
long long long int 8 -9223372036854775808~+9223372036854775807
unsigned int (unsigned long)
4字节8位可表达位数:2^32=42 9496 7296
范围:0 ~ 42 9496 7295 (42*10^8)
int (long)
4字节8位可表达位数:2^32=42 9496 7296
范围:-21 4748 3648 ~ 21 4748 3647 (21*10^8)
long long (__int64)
8字节8位可表达位数:2^64=1844 6744 0737 0960 0000
范围:-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807 (922*10^16)
unsigned long (unsigned __int64)
8字节8位可表达位数:2^64=1844 6744 0737 0960 0000
范围:0 ~ 1844 6744 0737 0955 1615 (1844*10^16)
int 类型可以保存10位数,且大约最高位数只能是1&2;
long long 类型可以保存19位数,而unsigned long 类型可以保存20位数,但最高位只能是1
(本题20位显然不能通过直接定义的方式来储存数据了)
2)如何将未知长度的数据存入一个数组中
第一种
char temp;
temp = getchar();//获取第一个字符
while (temp >= '0'&&temp <= '9') { //如果这个字符是数字,进入循环输入
num[i] = temp - '0';
i++;
temp = getchar();//如果获取到'\n',就退出循环
}
第二种
int b,i=0;
while(scanf("%d",&b)){
a[i++] = b;
if (getchar()=='\n')
{
array[i] = '\0';
break;
}
}
完整代码 :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
int a[25];
int number1[15] = {0};//储存原来数据0~9出现的次数
int number2[15] = {0};//储存加倍后数据0~9出现的次数
int i = 0;
char temp;
temp = getchar();
while (temp >= '0' && temp <= '9') {//输入数据
a[i] = temp - '0';
i++;
temp = getchar();
}
int len = i;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < len; j++) {
if (a[j] == i)
number1[i]++;
}
}
int num, flag = 0, count;
for (int j = len - 1; j >= 0; j--) {//相当于把乘法运算的原理写成代码
num = a[j] * 2;
num += flag;
if (num >= 10) {
count = 0;
while (num >= 10) {
num -= 10;
count++;
flag = count;
}
a[j] = num;
} else {
a[j] = num;
flag = 0;
}
}
int b[25];
if (flag != 0) {//如果加倍后位数增加了,那不用判断number了就肯定是No
b[0] = flag;
for (i = 0; i < len; i++)
b[i + 1] = a[i];
printf("No\n");
for (int k = 0; k < len + 1; k++) {
printf("%d", b[k]);
}
} else if (flag == 0) {//如果加倍后位数没有变化
int flag1 = 1;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < len; j++) {
if (a[j] == i)
number2[i]++;
}
}
for (int i = 0; i < 10; i++) {
if (number1[i] != number2[i]) {//判断和原来位数出现次数是否相同
flag1 = 0;
break;
}
}
if (flag1 != 0) {
printf("Yes\n");
for (int k = 0; k < len; k++) {
printf("%d", a[k]);
}
} else {
printf("No\n");
for (int k = 0; k < len; k++) {
printf("%d", a[k]);
}
}
return 0;
}
}