1. 程式人生 > 其它 >1021 個位數統計 1022 D進位制的A+B 1023 組個最小數 1024 科學計數法

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