武汉大学上机题
题目一描述:
给定两个正整数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;
}
运行测试: