我有一個給定的練習,希望我在這個名為 C 的字符變數中找到字母 K 處的大寫字母。 范圍是從 A 到 Z 的大寫字母。
例如,如果輸入是B 3輸出應該是E。對于這個特定的輸入,它很簡單,您只需將值相加即可得到答案,但例如,如果我們超出范圍會怎樣。這是F 100程式應該輸出的一個示例,B因為如果值 > 大于 Z,則程式從 A 開始。
如果有一些混淆,我將嘗試在此處進行更多解釋,這里有一些測驗用例和我的代碼,只有在我們不跨越范圍時才有效。
Input Output
B 3 E
X 12345 S
F 100 B
T 0 T
#include <stdio.h>
int main(){
int K;
char C,rez;
scanf("%c %d",&C,&K);
int ch;
for(ch = 'A';ch <= 'Z';ch ){
if(C>='A' && C<='Z'){
rez = C K;
}
}
printf("%c",rez);
return 0;
}
uj5u.com熱心網友回復:
將字母 [AZ] 視為以26為底的字母,其中 0 是 A,1 是 B,25 是 Z。
當我們對字母(以 26 為基數)和偏移量求和時,它只是我們感興趣的最低有效基數 26 數字,因此用于%查找最低有效基數 26 數字就像使用% 10查找最低有效十進制數字一樣。
scanf(" %c %d",&C,&K);
// ^ space added to consume any white-space
if (C >= 'A' && C <= 'Z') {
int base26 = C - 'A';
base26 = base26 K;
base26 %= 26;
int output = base26 'A';
printf("%c %-8d %c\n", C, K, output);
}
對于負偏移量,我們需要做更多的作業,%而不是mod運算子,而是剩余部分。這與一些負運算元不同。
base26 %= 26;
if (base < 0) base26 = 26; // add
int output = base26 'A';
迂腐,C K可能會溢位極端K值。考慮到這一點,K在添加之前先減少。
// base26 = C K;
base26 = C K%26;
我們可能有點偷偷摸摸地加上 26 以確保總和不是負數。
if (C >= 'A' && C <= 'Z') {
int base26 = C - 'A';
base26 = base26 K%26 26; // base26 >= 0, even when K < 0
base26 %= 26; // base26 >= 0 and < 26
int output = base26 'A';
printf("%c %-8d %c\n", C, K, output);
}
...或制作一個復雜的單行
printf("%c %-8d %c\n", C, K, (C - 'A' K%26 26)%26 'A');
uj5u.com熱心網友回復:
這可以通過使用 2 個概念來實作。
- ASCII 值
- 模運算子 (%)
在 C 中,每個字符都有一個 ASCII 值。基本上它從0-127。字符“A”的值為 65 字符“B”的值為 66 (65 1) 依此類推...直到 Z 為 65 25 = 90
我想在數學中強調的第二個概念是模算術,如果你總是想將一個數字映射到某個范圍,你可以使用模數運算子。模數是一個數字除以另一個數字后得到的提示。在我們的例子中,我們有 26 個字母,所以我們總能得到一個 0 到 25 之間的數字
對于示例,您采用 100 % 26 = 22 但您也必須考慮起點。
所以,我們總是用'A'的值減去初始字母,即65,這樣'A'映射到0,'Z'映射到25
所以,如果我們以'F'開頭并且需要去100個地方..
- 從“F”值中減去“A”值。字符的行為類似于數字,因此您實際上可以將 'F' - 'A' 存盤在整數中
在這種情況下'F' - 'A' = 5
接下來,我們將偏移量添加到此。5 100 = 105
然后我們用 26 105 % 26 = 1 執行模數
最后將 'A' 的值加回到結果 'A' 1 = 'B'
你已經完成了
uj5u.com熱心網友回復:
26使用模運算子獲取輸入數字的余數。如果輸入字符和余數的總和小于或等于Z那么它的答案,否則再次找到總和的余數,26這將是答案(注意偏移量,因為字母的 ASCII 十進制值為A65)。
大致的實作將是:
#include <stdio.h>
int main(){
int K;
char C, rez;
scanf("%c %d",&C,&K);
// Validate the user input
int ch;
int rem = K % 26;
if ((rem C) - 'A' < 26) {
rez = rem C;
} else {
rez = ((rem C - 'A') % 26) 'A';
}
printf("%c\n",rez);
return 0;
}
請注意,我知道在實施中有改進的余地。但這只是為了向 OP 提供有關如何完成的想法。
輸出:
# ./a.out
B 3
E
# ./a.out
X 12345
S
# ./a.out
F 100
B
# ./a.out
T 0
T
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/387601.html
上一篇:鏈表中間
