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