机测题代码

该博客包含两段C++代码实现。第一段代码用于解析输入字符串,统计剩余可用字符及其数量,保持输入顺序。第二段代码计算连续正整数之和,满足和等于给定总和,输出连续整数序列,否则返回-1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目1:

输入:a:5,b5,c:2@a:1,b:2

输出:a:4,b:3,c:2

输入由两部分组成,全量字符@已用字符,用@分开。全量字符a:5表示字符a总共有5个,已用字符a:1表示a已经用了1个.

输出的为剩下可用字符以及对应数量

要求输出的顺序和输入的顺序一致。

下面为代码:

#include <iostream>
#include <vector>

using namespace std;

int split_str(string source,  int len, vector<pair<char, int>>* vt)
{
	char ch;
	int num;
	char ch_tmp;
	int num_tmp;
	int i = 0;
	char str[20];
	ch = source[i];
	while (i  < len && ch != '\n')
	{
		memset(str, 0x00, sizeof(str));
		ch_tmp = ch;		
		i++;/*冒号*/
		/*数字部分*/
		while (i < len && ch != ',') {
			i++;
			ch = source[i];
				
			if (ch == ',' || i==len) {				
				num = atoi(str);
				auto p = std::make_pair((ch_tmp), (num));
				vt->push_back(p);
				break;
			}
			snprintf(str,sizeof(str),"%s%c",str,ch);
		}		
		if (i  >= len)break;
		/*下个字符串*/
		i++;
		ch = source[i];
	}
	return 0;
}

int main() {
	int i = 0;
	int flag = 0;
	int pos = 0;
	int len = 0;
	string org_str;
	string all_str;
	string sub_str;

	vector<pair<char, int>> all_mp;
	vector<pair<char, int>> sub_mp;
	vector<pair<char, int>>* p;
	cin >> org_str;
	len = org_str.length();
	pos = org_str.find('@', 0);
	all_str = string(org_str, 0, pos);
	sub_str = string(org_str, pos + 1, len - 1 - pos);
	p = &all_mp;
	split_str(all_str, all_str.length(), p);
	p = &sub_mp;
	split_str(sub_str,  sub_str.length(), p);
	flag = 0;
	for (auto iter : all_mp) {		
		for (auto iter2 : sub_mp) {
			if (iter.first == iter2.first) {
				cout << iter.first << ":" << iter.second - iter2.second ;
				flag = 1;
				break;
			}			
		}
		if(flag !=1) {
			cout << iter.first << ":" << iter.second ;
		}
		flag = 0;
		if (iter.first != all_mp.back().first)
			cout << ",";
	}
	return 0;
}

题目2:

输入: 545 5

输出:107 108 109 110 111

输入有个两个正整数,第一个为总和sum,第二个为数目n

输出为n个连续正整数的和,这个和与sum相等。如果没有符合的输出,则返回-1

#include<iostream>
using namespace std;

int main()
{
	int all;
	int num;
	int sum = 0;
	while(1)
	{ 
		sum = 0;
		cin >> all >> num;
		if (num > 2 && num % 2 == 0 && all % 2 != 0) {
            return -1;
			//cout << "err 大于2的偶数个数相加,不可能有奇数的和 =" << num << endl;
			//cout << "===================================================" << endl;
			//continue;
		}/*大于2的偶数个数相加,不可能有奇数的和*/
		int mid = int ((all / num) + (num%2!=0?0:1));
		//cout <<"mid"<< mid << endl;
		int head = mid - int(num / 2);
		//cout <<"head"<< head <<" "<< int (num/2)<< endl;
		if (head < 1) {
            return -1;
			//cout << "err head=" << head << endl;
			//cout << "===================================================" << endl;
			//continue;
		}
		else 
		{
			for (int i = 0; i < num; i++)
			{
				sum += (head + i);
				//cout << sum << "->";
			}
			//cout << endl;
			if (sum == all)
			{
				for (int i = 0; i < num; i++)
					cout << head + i << " " ;
			}
			else {
                return -1;
				//cout << "err sum=" << sum << endl;
				//cout << "===================================================" << endl;
				//continue;
			}
			cout << endl;
		}
		//cout << "===================================================" << endl;
		return 0;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值