7-49 Have Fun with Numbers(20 分)
前言
大一新生,自学C语言一个月,第一次写博客,希望借写博客进行总结反思,并记录当下的一些想法,在写博客的过程中精简一下原先写过的代码。
题目:
Have Fun with Numbers (20分)
作者 陈越
单位 浙江大学
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
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:
1234567899
Sample Output:
Yes
2469135798
1.参考代码
代码如下:
#include<stdio.h>
#define D 21 //输入数据不超过20位
#define S 10 //10位数字
void f(int *m,int i);//统计数字
int main(void)
{
char A[D];
int C[D]={0},E[D]={0},m[S]={0},n[S]={0};
int count=0,r=1;
//以字符数组读入
for(int i=0;i<D;i++){
A[i]=getchar();
if(A[i]=='\n')break;
count++;
}
//为C数组赋值顺序存入数字
for(int t=0;t<count;t++)C[t]=A[t]-'0';
//统计各个数字个数
for(int t=0;t<count;t++)f(m,C[t]);
//将乘2后的结果存入数组
for(int j=count-1;j>=0;j--){
//乘积大于十,下一位进一
if(2*C[j]>9){
E[j]+=(2*C[j]-10);
E[j-1]++;
}
//乘积小于10不进位
if(2*C[j]<=9)E[j]+=2*C[j];
}
//统计乘2后各个数字的数量
for(int t=0;t<count;t++)f(n,E[t]);
if(C[0]*2>9)n[1]++;
//对比m n数组看是否相等
for(int t=0;t<10;t++){
if(n[t]!=m[t]){
r=0;
break;
}
}
if(r==1)printf("Yes\n");
else printf("No\n");
if(C[0]*2>9)printf("1");
for(int t=0;t<count;t++)printf("%d",E[t]);
return 0;
}
void f(int *m,int a)
{
m[a]++;
}
总结
1.第一次写这题是用的long long int,但是会有一个测试点无法通过,
最后才想到大数应该用字符数组处理,对long long int类型范围不够了解
long long int范围(-9223372036854775808~+9223372036854775807)
原做法只能处理部分十九位的数字,无法处理20位数字。
2.开始写的代码十分繁琐,可读性差,定义了过多变量,但实际上这些代码是不必要的
,处理方式过于低效。应该更合理的定义用于进行条件判断的变量。
3.学习时间不长,还只是个萌新,有问题还望各位大佬指点。