武汉大学上机题

武汉大学上机题

题目一描述:
给定两个正整数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;
}

运行测试:
在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值