1021 个位数统计 1022 D进制的A+B 1023 组个最小数 1024 科学计数法
我变强了?题目简单了!
写了四题,都没啥好说的,在考虑不写PAT了。。C语言熟悉的差不多了,再写浪费时间了。
1021 个位数统计 (15 分)
给定一个 k 位整数 N=d**k−110k−1+⋯+d1101+d0 (0≤d**i≤9, i=0,⋯,k−1, d**k−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M
的格式在一行中输出该位数字 D
及其在 N 中出现的次数 M
。要求按 D
的升序输出。
输入样例:
100311
输出样例:
0:2
1:3
3:1
题解:
#include<stdio.h>
int main()
{
int arry[10] = { 0 };
char temp='0';
int i = 0;
for (int i = 0; temp != '\n'; i++)
{
scanf("%c", &temp);
arry[temp - '0']++;
}
for (int i = 0; i < 10; i++)
{
if(arry[i]!=0)printf("%d:%d\n", i, arry[i]);
}
}
1022 D进制的A+B (20 分)
输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1<D≤10)进制数。
输入格式:
输入在一行中依次给出 3 个整数 A、B 和 D。
输出格式:
输出 A+B 的 D 进制数。
输入样例:
123 456 8
输出样例:
1103
题解:
#include<stdio.h>
int main()
{
long A, B;
long sum;
int D;
int length = 0;
scanf("%ld %ld %d", &A, &B, &D);
sum = A + B;
if (sum == 0)
{
printf("0");
return 0;
}
int arr[40] = { 0 };
for (int i = 0; sum != 0; i++)
{
arr[i] = sum % D;
sum = sum / D;
length++;
}
for (int i = --length; i >=0; i--)
{
printf("%ld", arr[i]);
}
}
1023 组个最小数 (20 分)
给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50,且至少拥有 1 个非 0 的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558
题解:
#include<stdio.h>
int main()
{
int arr[10];
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
//找首位除0最小的数字
for (int i = 1; i < 10; i++)
{
if (arr[i] != 0)
{
printf("%d", i);
arr[i]--;
break;
}
}
for (int i = 0; i < 10; i++)
{
for (int j = arr[i]; j > 0; j--)
{
printf("%d", i);
}
}
}
1024 科学计数法 (20 分)
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].
[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。
输入格式:
每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。
输出格式:
对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。
输入样例 1:
+1.23400E-03
输出样例 1:
0.00123400
输入样例 2:
-1.2E+10
输出样例 2:
-12000000000
题解:
#include<stdio.h>
#include<math.h>
int main()
{
char input[20000];
int judge = -1;
int num[20000] = { 0 };
int cishu[20000] = { 0 };
int length = 0;
int cishugeshu = 0;
//扫描输入
for (int i = 0; input[i-1]!='\n'; i++)
{
scanf("%c", &input[i]);
}
//预处理输入
for (int i = 0; input[i] != '\n'; i++)
{
if (judge != -1&&input[i]!='+'&&input[i]!='-')
{
cishu[cishugeshu] = input[i] - '0';
cishugeshu++;
}
if (input[i] == 'E')
{
if (input[i + 1] == '+')judge = 1;
else judge = 0;
}
if (input[i] != '.' && i > 0 && judge == -1)
{
num[length] = input[i] - '0';
length++;
}
}
if (input[0] == '-')printf("-");
if (judge == 0)//小数
{
int time = 0;
printf("0.");
if (cishu[0] == 0)time = cishu[1];
else
{
for (int i = 0; i < cishugeshu; i++)
{
time += cishu[i] * pow(10, cishugeshu - i - 1);
}
}
for (int i = 0; i < time-1; i++)
{
printf("0");
}
for (int i = 0; i < length; i++)
{
printf("%d", num[i]);
}
}
//+1.234564E+2
if (judge == 1)
{
int time = 0;
if (cishu[0] == 0)time = cishu[1];
else
{
for (int i = 0; i < cishugeshu; i++)
{
time += cishu[i] * pow(10, cishugeshu - i - 1);
}
}
if (time >= length - 1)
{
for (int i = 0; i < length; i++)
{
printf("%d", num[i]);
}
for (int i = 0; i < time - length + 1; i++)
{
printf("0");
}
}
else
{
for (int i = 0; i < length; i++)
{
if (i == time + 1)
{
printf(".");
}
printf("%d", num[i]);
}
}
}
}
总结:
这道题说一下吧。。也没啥好说的。。不说了
感觉就是这几个输入输出来来回回的,这道题我写的蛮笨,看了别人的,确实有很巧的输入手法,但是我主要是想学数据结构啊,PAT差不多得了!