本文共 8780 字,大约阅读时间需要 29 分钟。
函数int same(int num)
中,首先将整型数字转换为数组data
,保存每一位数字。然后,根据数字长度判断是否至少为4位。接着,通过循环移位法,检查是否存在至少两位相同的部分。
1. 数字是否存在相同部分
求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数。如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。
函数为`int same(int num)`,其中num是输入的整型数字。
使用循环移位法。如,每次全扫描匹配一次。至外循环为length-2次。
12345678 12345678 12345678 12345678 12345678 12345678
78123456 67812345 56781234 45678123 34567812 23456781
int same(int num) { int data[100]; int length = 0; int count = 0; while (num > 0) { data[length++] = num % 10; num /= 10; } if (length < 4) return 0; for (int i = 2; i < length; i++) { int j = 0; while (j < length - i) { if (data[i + j] == data[j]) { count++; if (count >= 2) return 1; } else { count = 0; } j++; } } for (int i = length - 2; i >= 0; i--) { int j = 0; while (j < length - i) { if (data[i + j] == data[length - i + j]) { count++; if (count >= 2) return 1; } else { count = 0; } j++; } } return 0;}
2. 识别字符串中的整数并转换为数字形式
问题描述:
识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数。
要求实现函数:
void take_num(const char *strIn, int *n, unsigned int *outArray)
【输入】 strIn:输入的字符串
【输出】 n:统计识别出来的整数个数
outArray:识别出来的整数值,其中outArray[0]是输入字符串中从左到右第一个整数,依此类推。
【返回】无
注:
I、不考虑字符串中出现的正负号(+, -),即所有转换结果为非负整数(包括0和正整数)
II、不考虑转换后整数超出范围情况,即测试用例中可能出现的最大整数不会超过unsigned int可处理的范围
III、需要考虑 '0' 开始的数字字符串情况,比如 "00035" ,应转换为整数35;"000" 应转换为整数0;"00.0035" 应转换为整数0和35(忽略小数点:mmm.nnn当成两个数mmm和nnn来识别)
IV、输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。
示例:
输入:strIn = "ab00cd+123fght456-25 3.005fgh"
输出:n = 6
outArray = {0, 123, 456, 25, 3, 5}
void take_num(const char *strIn, int *n, unsigned int *outArray) { if (strIn.empty()) return; int i = 0; bool flag = false; while (i < strlen(strIn)) { if (!isdigit(strIn[i]) && !flag) { flag = true; i++; continue; } if (isdigit(strIn[i])) { unsigned int num = 0; while (isdigit(strIn[i])) { num = num * 10 + (strIn[i] - '0'); i++; } if (flag) { flag = false; if (num != 0 || (num == 0 && outArray[0] == 0)) { if (outArray[0] == 0 && num == 0) { outArray[0] = 0; } else { outArray[0] = num; } *n += 1; } if (outArray[1] == 0 && num == 0) { outArray[1] = 0; } else { outArray[1] = num; } *n += 1; } else { if (outArray[0] == 0 && num == 0) { outArray[0] = 0; } else { outArray[0] = num; } *n += 1; } } }}
3. 计算字符串
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
示例:
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“9 ++ 7” 输出:“0” 注:格式错误
#include #include using namespace std;bool getNum(const char *p, int &result) { if (!p || *p < '0' || *p > '9') { return false; } else { result = 0; while (*p >= '0' && *p <= '9') { result = result * 10 + (*p - '0'); p++; } return true; }}int jisuan(const char *s) { if (!s || !isdigit(*s)) { return 0; } int left = 0, right = 0; bool flag = true; bool flagOpt = true; while (*s != '\0') { if (flagOpt && isdigit(*s) && getNum(s, right) && (*s == ' ' || *s == '\0')) { if (flag) { left = left + right; } else { left = left - right; } flagOpt = false; if (*s == ' ') { s++; } } else if (!flagOpt && (*s == '+' && s[1] == ' ')) { flag = true; flagOpt = true; s += 2; } else if (!flagOpt && (*s == '-' && s[1] == ' ')) { flag = false; flagOpt = true; s += 2; } else { return 0; } } return left;}int main() { string s; getline(cin, s); int result = jisuan(s.c_str()); cout << result << endl;}
4. 身高差值最小
要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高。
Sample input:161 189 167 172 188 Sample outPut: 188189
int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b;}template int choose(int (&data)[N]) { if (N <= 1) { return -1; } qsort(data, N, sizeof(int), cmp); int index = 0; int min = data[1] - data[0]; for (int i = 1; i < N; i++) { if (data[i] - data[index] < min) { min = data[i] - data[index]; index = i; } } return index;}
5. 确定数字中有某个数字并排序
输入一行数字:123 423 5645 875 186523
在输入第二行:23
将第一行中含有第二行中“23”的数输出并排序结果即:123 423 186523
#include #include #include #include using namespace std;int compare(const void *arg1, const void *arg2) { return *(int *)arg1 - *(int *)arg2;}bool decision(int num, const string &key) { char *p = new char[10]; memset(p, 0, 10); itoa(num, p, 10); string s(p); return s.find(key) != string::npos;}void main() { vector vec; int temp; while (cin >> temp) { vec.push_back(temp); if (cin.get() == '\n') { break; } } string key; getline(cin, key); for (auto iter = vec.begin(); iter != vec.end(); ++iter) { if (!decision(*iter, key)) { iter = vec.erase(iter); } else { ++iter; } } sort(vec.begin(), vec.end()); for (int i = 0; i < vec.size(); i++) { if (!decision(vec[i], key)) { vec.erase(vec.begin() + i); i--; } } sort(vec.begin(), vec.end()); for (int num : vec) { if (decision(num, key)) { cout << num << " "; } } cout << endl;}
6. 输入整型数组求数组的最小数和最大数之和
输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50
int process() { int temp; cin >> temp; int min = max = temp; char c = getchar(); while (c != '\n') { cin >> temp; if (temp > max) { max = temp; } else if (temp < min) { min = temp; } c = getchar(); } return min + max;}
7. 数组中数字两两相同,有两个不同,找出这两个
#include #include using namespace std;int main() { vector vec; int temp; char ch = getchar(); while (ch != '\n') { vec.push_back(temp); cin >> temp; ch = getchar(); } vec.push_back(temp); temp = 0; for (int i = 0; i < vec.size(); i++) { if (vec[i] != temp) { temp = vec[i]; vec.push_back(temp); } } vec.erase(unique(vec.begin(), vec.end()), vec.end()); if (vec.size() != 2) { cout << "0" << endl; } else { if (vec[0] == vec[1]) { cout << "0" << endl; } else { cout << vec[0] << vec[1] << endl; } }}
8. 超过数组长度一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
#include #include using namespace std;int main() { vector vec; int temp; char ch = getchar(); while (ch != '\n') { vec.push_back(temp); cin >> temp; ch = getchar(); } vec.push_back(temp); if (vec.size() % 2 == 0) { int half = vec.size() / 2; } else { int half = vec.size() / 2 + 1; } map countMap; for (int num : vec) { countMap[num]++; } for (auto pair : countMap) { if (pair.second > half) { cout << pair.first << endl; return; } } cout << "0" << endl;}
9. 字符串首字母转换成大写
#include #include using namespace std;void convert(string &s) { if (s.empty()) { return; } int i = 0; while (i < s.size()) { if (s[i] >= 'a' && s[i] <= 'z') { s[i] = s[i] - 'a' + 'A'; } i++; }}
转载地址:http://cygfk.baihongyu.com/