前言:发现PTA的题目,不难就是令人想不到,感觉考察综合能力。
给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以
D:M
的格式在一行中输出该位数字D
及其在 N 中出现的次数M
。要求按D
的升序输出。
输入样例:
输出样例:
思路1:第一次做这道题的思路是,利用%10和/10来把n数的每一位拆下俩,放进一个数组里,然后用一个0到9数组与它比较,然后计算每一个数出现的次数。就像下面的代码。但是就是有一个缺点。就是n全是0,while循环就进不进去了。(这个代码不是很适合)
int main() {
long n = 0;
scanf("%d", &n);
int a = 0;
int arr1[10] = { 0,1,2,3,4,5,6,7,8,9 };//比较的数组
int arr[100] = { 0 };//拆下来放进里面的数组
int arr2[10] = { 0 };//计算每一个数字出现的次数
int i = 0;
while (n!=0)
{
a = n % 10;
n /= 10;
arr[i] = a;
i++;
if (n<10)
{
arr[i] = n;
}
}
for (int j = 0; j <i; j++)
{
for (int i = 0; i <10; i++)
{
if (arr[j]==arr1[i])
{
arr2[i]++;
break;
}
}
}
for ( i = 0; i< 10; i++)
{
if (arr2[i] != 0) {
printf("%d:%d\n", i, arr2[i]);
}
}
return 0;
}
思路二:我就把n这个数,改为字符串形式,可能就会有人疑问,这咋个比较?再ASCLL表中一个字符数字减去一个字符0(‘0’)就是他对应的数字。例如:(‘1’-‘0’=1)。当然也可以用strcmp这个函数比较两个字符串。
#include <stdio.h>
#include <string.h>
int main() {
char arr[1000] = { 0 };
scanf("%s", &arr);
int a = 0;
int arr1[10] = { 0,1,2,3,4,5,6,7,8,9 };
int arr2[10] = { 0 };
int i = 0;
int j = 0;
int ret = strlen(arr);
for ( i = 0; i<ret; i++)
{
for ( j = 0; j < 10; j++)
{
if ( arr1[j]== (arr[i] - '0'))//减去字符0
{
arr2[j]++;
break;
}
}
}
for ( i = 0; i< 10; i++)
{
if (arr2[i] != 0) {
printf("%d:%d\n", i, arr2[i]);
}
}
return 0;
}
或许还有人疑问,arr2这个数组咋个用,我们这次用100311举例,下面是arr2在调试中的图。
总体来说还是这个代码实用。
题目链接。