自测-4 Have Fun with Numbers (20分)

自测-4 Have Fun with Numbers (20分)
自测-4 Have Fun with Numbers (20分)_第1张图片思路分析:文章的大概意思是:输入一串k位(k<=20)数字n,将它乘以2,得到结果数字m,m中出现的数字是否和输入的数字n中出现的数字次数一样,即由相同数字组成,只是位置发生了变化,如果是,就返回yes,如果不是,就返回no
由于最大可以输入20位的数字,就算是long long 类型的整型也存储不了,而且如果存在一个整型变量中,会导致不好判断每一个数字出现的次数,于是将这个数存放在字符串类型,string,char[]比较合适
通过遍历数字,将每一个出现的数字和0~9作比较,得到每个数字出现的次数,并将他们存放在数组中,相当于把 0到9作为一个标准,将每一次数与他们比较,如果相同就加上1,

比较标准:0 1 2 3 4 5 6 7 8 9
比较数组:2 4 6 5 8 1 2 3 5 4
出现次数:0 1 2 1 2 2 1 0 1 0
比较数组:2 9 3 1 6 2 4 7 0 8
出现次数:1 1 2 1 1 0 1 1 1 1

由上图可知,这个数乘以2以后,数字出现的次数和该数不相等
输出no的情况有:1.当乘以2以后的位数超过原来的位数,直接输出no
2.当两组数中数字出现的次数不同的时候

#include 
#include 
#define MAX 20
using namespace std;
void print(int num[],int len);//定义一个输出的方法
void counting(int* num,int* a, int len);

int main()
{
string str;
cin >> str;
int num1[MAX],num2[MAX];//num1,存放输入的数组,num2,存放乘以2以后的数组
int a[10];
int b[10];//0~9的数字,一共由10位数
int i = 0;
int size = 0;
int flag=1;
while(str[i]!='\0')
{
num1[i]  = str[i]-48; 
num2[i]  = num1[i]*2;
i++;//ACSII码
size++;
}
//检查是否有进位
for(i = size-1; i>=1; i--)//i只用检查到1位就可以了,因为如果第0位进位,则直接可以判断不成立
{
	if(num2[i]>=10)
	{
	num2[i] = num2[i]-10;
	num2[i-1] = num2[i-1]+1;
	}
}
if(num2[0]>=10)
{
cout<<"No"<<endl;
print(num2,size);
}else
{
counting(num1,a,size);
counting(num2,b,size);
for(int z =0;z<10;z++)
{
if(a[z]!=b[z])
    {
    flag = 0;
    break;
    }
}
if(flag ==1)
{
cout<<"Yes"<<endl;
print(num2,size);
}else
{
cout<<"No"<<endl;
print(num2,size);
}
}
return 0;
}

void print(int num[],int len)
{
	for(int i =0; i <len; i++)
    {
        cout<<num[i];
    }
}

void counting(int* num,int* a, int len)
{
int m=0, n=0;
for(m = 0;m<len;m++)
{
	for(n = 0;n<=9;n++)
	{
	if(num[m]==n)a[n]++;
	}	
}
}

总结:在编译这个题目的时候出现了很多错误,比如说,if-else语句的括号包含问题。a,b数组最大长度问题。还有在数组作为函数参数传递的时候,如果数组的值要更改,那么要用指针来传递数组。中间有一段代码

while(str[i]!='\0')
{
num1[i]  = str[i]-48; 
num2[i]  = num1[i]*2;
i++;//ACSII码
size++;
}

在判断size的大小的时候,我也出现了问题,这里的size初始值是0,所以每一次递增都代表了这个数组的长度,而不是这个数组当前数字的位置。同时这段代码,将遍历数组和乘以2操作共同执行,可以提高代码啊的简洁度

for(i = size-1; i>=1; i--)//i只用检查到1位就可以了,因为如果第0位进位,则直接可以判断不成立
{
	if(num2[i]>=10)
	{
	num2[i] = num2[i]-10;
	num2[i-1] = num2[i-1]+1;
	}
}

这段代码用于检查是否进位,值得注意的是,即使这个数位两位数,它在数组中所占的位置也只有一个

for(int z =0;z<10;z++)
{
if(a[z]!=b[z])
    {
    flag = 0;
    break;
    }
}

注意这段代码的功能,这里是比较a和b数组中出现数字的次数是否相同,这里的z<10即可,因为a和b的数组最大长度为10

你可能感兴趣的:(自主学习-数据结构与算法)