复数乘法
输入两个表示复数的字符串,输出它们相乘的结果的字符串
复数字符串用a+bi表示(a, b 为整数, i为虚数单位,i2=1)
输入描述:
两个表示复数的字符串
输出描述:
两个数相乘的结果的字符串
思路:
模拟复数相乘的运算。用字符串分别读入两个表达式,用substr函数切割,分别提取出来实数部分和复数部分你,然后模拟运算。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int main(){
string str1;
string str2;
while (cin >> str1 >> str2){
//截取整数部分
string s1First = str1.substr(0,str1.find('+'));
string s2First = str2.substr(0,str2.find('+'));
int s1f = stoi(s1First);
int s2f = stoi(s2First);
//截取复数部分
string s1Second =str1.substr(str1.find('+')+1);
string s2Second =str2.substr(str2.find('+')+1);
int s1s = stoi(s1Second);
int s2s = stoi(s2Second);
int real = s1f *s2f - s1s * s2s;
int comp = s1f *s2s + s1s * s2f;
cout<<real<<"+"<<comp<<"i"<<endl;
}
return 0;
}
一年中的第几天
输入一个"YYYY-MM-dd"格式的日期字符串,输出该天是当年的第几天(1 月 1 日是每年的第 1 天)
输入描述:
一个"YYYY-MM-dd"格式的表示日期的字符串
输出描述:
该天是当年的第几天
输入例子1:
2019-01-09
输出例子1:
9
输入例子2:
2004-03-01
输出例子2:
61
例子说明2:
2004年为闰年,所以是第31+29+1=61天
思路:
见注释
代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int main(){
string s;
while (cin>> s){
//用一个数组记录一年当中,当前月累加的天数
static int days[13]={
0,31,59,90,120,151,181,212,243,273,304,334,365};
vector<string>vec;
string temp;
//用substr分割字符串,将年份、月份、天数都存到一个vector中
for (int i = 0; i < 2; ++i) {
temp = s.substr(0,s.find('-'));
vec.push_back(temp);
temp.clear();
s= s.substr(s.find('-')+1);
}
vec.push_back(s);
//将对应的字符串转成整数,做运算
int year = stoi(vec[0]);
int month = stoi(vec[1]);
int day = stoi(vec[2]);
int ret = days[month-1] + day;
if(((year%4 == 0 && year%100 != 0) || year % 400 == 0) && month > 2){
++ret;
}
cout<<ret<<endl;
}
return 0;
}
k个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
输入描述:
第一行:依次输入链表中的各个元素,以"#"结束
第二行:每组数量k
输出描述:
处理后的链表中的各个元素,以"->"连接
输入例子1:
1 2 3 4 5 #
2
输出例子1:
2->1->4->3->5
输入例子2:
1 2 3 4 5 #
3
输出例子2:
3->2->1->4->5
思路:
见注释
代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void reverseK(vector<string>& vecStr, int start,int end){
while (start < end){
vecStr[start].swap(vecStr[end]);
start++;
--end;
}
}
int main(){
string str;
vector<string> vecStr;
//将字符读出来,放到字符数组中去
while (cin >> str){
if(str != "#"){
vecStr.push_back(str);
}
else{
break;
}
}
int k;
cin >> k;
int start = 0;
//判断后面的是否能够凑够k个
while (start+k-1 < vecStr.size()) {
reverseK(vecStr,start,start+k-1);
start += k;
}
//这里输出的时候,要注意不要采坑
for (int i = 0; i < vecStr.size()-1; ++i) {
cout<<vecStr[i]<<"->";
}
cout<<vecStr.back()<<endl;
}