武漢大學上機題
題目一描述:
給定兩個正整數a和b,求在[a,b]中的所有整數中,每個數碼(digit 0-9)各出現了多少次。
例如輸入:
1 99
輸出:
9 20 20 20 20 20 20 20 20 20
算法思想:
對a和b之間的所有數進行逐個分析,拆分各個數字的所有位,對數碼出現的次數進行統計。
#include<iostream>
using namespace std;
int main() {
int a, b;
cout << "輸入範圍:";
cin >> a >> b;
int num[10] = { 0,0,0,0,0,0,0,0,0,0 };//定義一個數組存儲0-9數字每個數的出現次數
for (int i = a;i <= b;i++) {
int j = i;
while (j / 10) {//拆開數字的每一位
num[j % 10]++;
j = j / 10;
}
num[j]++;
}
cout << "result:" << endl;
for (int i = 0;i < 10;i++)
cout << num[i] << '\t';
cout << endl;
return 0;
}
運行測試:
題目二描述:
輸出一個整數n(0<n<10),顯示n行如下規律圖形。
例如輸入3,顯示:
1
2 3
4 5 6
例如輸入5,顯示:
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
#include<iostream>
using namespace std;
int main() {
int num = 1;
int n;
cout << "輸入行數:";
cin >> n;
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= n - i;j++)//輸出n-i個空格
cout << " " << '\t';
for (int j = 1;j <= i;j++) {//輸出i個數字,每次輸出一個數字後num+1
cout << num << '\t';
num++;
}
cout << endl;
}
return 0;
}
運行測試:
題目三描述:
兩個數字字符串相加
有定義:char s1[200],s2[200],s3[200]
若輸入s1和s2非全數字字符串,顯示輸入錯誤;
否則計算s1和s2相加的結果,存放於s3並顯示。
例如輸入:
9999999999999
9999999999999
輸出:
19999999999998
例如輸入:
1234567890123456789
876543211
輸出:
1234567891000000000
算法思想:
首先要判斷字符串是否全是數字,一個字符一個字符逐個判斷;
數字相加這裏從高位到低位逐位相加,進位要加上,這裏的問題就是我們存儲數字的時候是從高位到低位存儲的,而運算結果的時候採用從低位到高位進行存儲的方法,等計算完成後,再對結果進行逆置,就得到正確的結果。
#include<iostream>
#include<string>
using namespace std;
bool isAllNum(char c[]) {//判斷數組中存放的是否全是數字
for (int i = 0;i < strlen(c);i++) {
if (!(c[i] >= '0' && c[i] <= '9'))
return false;
}
return true;
}
void add(char s1[], char s2[], char s3[]) {//實現大數相加
int i = strlen(s1) - 1;//i指針指向s1尾部
int j = strlen(s2) - 1;//j指針指向s2尾部
int flag = 0;//flag指向s3首部
int tag = 0;//進位數
while (i >= 0 && j >= 0) {//從低位到高位進行運算
int a = s1[i] - '0';
int b = s2[j] - '0';
int temp = a + b + tag;
if (temp >= 10) {//有進位
tag = 1;
s3[flag] = temp - 10 + '0';
}
else {//無進位
tag = 0;
s3[flag] = temp + '0';
}
i--;
j--;
flag++;
}
if (i >= 0) {//如果s1沒到最高位
while (i >= 0) {
int temp = s1[i] - '0' + tag;
if (temp >= 10) {
tag = 1;
s3[flag] = temp - 10 + '0';
}
else {
tag = 0;
s3[flag] = temp + '0';
}
i--;
flag++;
}
}
else if (j >= 0) {//如果s2沒到最高位
while (j >= 0) {
int temp = s2[j] - '0' + tag;
if (temp >= 10) {
tag = 1;
s3[flag] = temp - 10 + '0';
}
else {
tag = 0;
s3[flag] = temp + '0';
}
j--;
flag++;
}
}
if (tag == 1) {//如果最後還有進位
s3[flag] = 1 + '0';
flag++;
}
s3[flag] = '\0';
char t;
for (int k = 0;k < strlen(s3) / 2;k++) {//因爲一開始是從低位到高位存儲的,所以最後需要使s3逆序
t = s3[k];
s3[k] = s3[strlen(s3) - 1 - k];
s3[strlen(s3) - 1 - k] = t;
}
}
int main() {
char s1[200], s2[200], s3[200];
cout << "輸入s1:";
cin >> s1;
cout << "輸入s2:";
cin >> s2;
if (isAllNum(s1) && isAllNum(s2)) {
add(s1, s2, s3);
cout << s1 << "+" << s2 << "=" << s3 << endl;
}
else {
cout << "輸入錯誤" << endl;
}
return 0;
}
運行測試: