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 进制整数 AB (≤230−1),输出 A+BD (1<D≤10)进制数。

输入格式:

输入在一行中依次给出 3 个整数 ABD

输出格式:

输出 A+BD 进制数。

输入样例:

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差不多得了!

posted @ 2022-04-08 21:02  huigugu  阅读(38)  评论(0编辑  收藏  举报