武漢大學上機題

武漢大學上機題

題目一描述:
給定兩個正整數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;
}

運行測試:
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章