目录
A:被11除的余数
题目描述
给定一个正整数n,n的位数可达80位。求n被11除的余数。
输入
输入数据的第一行是一个整数T,(T<20)。接着有T行,每行上有一个用字符串表示的正整数n(长度不超过80),对应一种情形。
输出
对于每一种情形,求n被11除所得的余数。
样例输入
3
78
70906
781020569876102789
样例输出
1
0
2
//被11除的余数
#include<iostream>
//递归写法
void devide11(std::string num)
{
if(num.size()<10)
{
// 不要写 int result = std::stoi(num)%11;
int result = std::stoi(num);
std::cout<<result%11<<std::endl;
return ;
}
else if(num.size()>=10)
{
// 前五位运算
int num_temp = std::stoi(num.substr(0,5));//位置,长度
int temp = num_temp % 11;
// std::string str = num.substr(5);//截取第五位之后的
// std::string temp_ = std::to_string(temp);
// std::string str2 = temp_.append(str);//将前五位计算的余数与第五位后的拼接
// std::cout<<temp_<<std::endl;
std::string str = std::to_string(temp).append(num.substr(5));
devide11(str);
}
}
void devide11_for(std::string num)
{
if(num.size()<10)
{
int result = std::stoi(num);
std::cout<<result%11<<std::endl;
return ;
}
while(num.size()>=10)
{
// 前五位运算
int num_temp = std::stoi(num.substr(0,5));//位置,长度
int temp = num_temp % 11;
// std::string str = num.substr(5);//截取第五位之后的
// std::string temp_ = std::to_string(temp);
// std::string str2 = temp_.append(str);//将前五位计算的余数与第五位后的拼接
// std::cout<<temp_<<std::endl;
// 不要写 std::string num = std::to_string(temp).append(num.substr(5));
// 报错
std::string str = std::to_string(temp).append(num.substr(5));
num = str;
if(num.size()<10)
{
int result = std::stoi(num);
std::cout<<result%11<<std::endl;
return ;
}
}
}
int main()
{
std::string num;
int count;
std::cin>>count;
while(count--)
{
std::cin>>num;
devide11_for(num);
}
// while(std::cin>>num)
// {
// int temp =0;
// int i;
// for(i=1;i<num.size();i++)
// {
// temp = ((num[i-1]+temp) *10 + num[i])%11;
// }
// std::cout<<temp<<std::endl;
// }
}
B:最大子段和
题目描述
最大子段和问题又叫最大子数列问题。该问题的目标是在一个数列中找到一个连续的子数列,使该子数列的和最大。例如,对数列−2, 1, −3, 4, −1, 2, 1, −5, 4,其连续子数列中和最大的是4,−1, 2, 1,其和为6。
你的任务,就是对于给定的数列,求出其中的一个子数列使其和最大。
输入
有多组数据。每组数据有2行,第一行是一个整数n(0<=n<=100),表示数列的长度,第二行上有n个整数a1, a2, ..., an(-100<=ai<=100),其中至少数有一个非负。
输出
对每组测试数据,输出它的最大子段和值。
样例输入
6
-2 11 -4 13 -5 -2
8
4 -2 5 -1 5 6 -3 -50
样例输出
20
17
#include<iostream>
int MaxSum(int a[],int left,int right)
{
int sum = 0, midSum = 0,leftSum =0,rightSum =0;
int i, center, s1, s2,lefts, rights;
if(left == right)
sum = a[left];
else
{
center = (left + right) /2;
leftSum = MaxSum(a, left, center);
rightSum = MaxSum(a, center+1, right);
s1 =0;
lefts =0;
for(i = center; i>=left;i--)
{
lefts +=a[i];
if(lefts>s1) s1 =lefts;
}
s2 =0;
rights =0;
for(i = center +1;i<=right;i++)
{
rights +=a[i];
if(rights >s2 ) s2 = rights;
}
midSum = s1 +s2;
if(midSum<leftSum) sum = leftSum;
else sum = midSum;
if(sum< rightSum) sum = rightSum;
}
return sum;
}
int main()
{
int num_length;
while(std::cin>>num_length)
{
int nums[num_length];
for(int i=0;i<num_length;i++)
{
std::cin>>nums[i];
}
std::cout<<MaxSum(nums,0,num_length-1)<<std::endl;
}
}
C:二分查找
题目描述
给定一列整数a1、a2、…、an,以及一个整数x,判定x是否在其中。
输入
一组数据由两行组成,第一行是两个正整数n,x。第二行有n个已排好序的整数a1、a2、…、an,整数之间用空格隔开。
输出
对输入的n个整数a1、a2、…、an,及x,如果x在其中出现,那么输出“place=”,接着输出数#,其中#是x在数列中的位置数(第1个数的位置是1);如果找不到,那么输出“Not found.”.
样例输入 Copy
4 9
1 5 6 9
4 15
2 10 20 21
样例输出
place=4
Not found.
#include<iostream>
#include<vector>
void Binary_Search(std::vector<int> nums,int target)
{
int left = 0;
int right = nums.size()-1;//记得减一
int mid = (left + right) /2;
while(left<=right)//等于的时候剩下最后一个,也要判断
{
if(nums[mid]>target)
{
right = mid-1;//记得等下一位而不是mid,不然最后剩下两个的时候会卡死
}
else if(nums[mid]<target)
{
left = mid+1;
}
else if(nums[mid]==target)
{
std::cout<<"place="<<mid+1<<std::endl;
return ;
}
mid = (left + right) /2;
}
std::cout<<"Not found."<<std::endl;
}
int main()
{
int num_length, target;
while (std::cin >> num_length)
{
std::cin>>target;
std::vector<int> nums(num_length);
for (int i = 0; i < num_length; i++)
{
std::cin >> nums[i];
}
Binary_Search(nums, target);
}
}
D:最小差问题
题目描述
若给定两个数组(第一个是数组 A已经排好序,第二个是数组 B),在数组 A 中找 A[i],数组B中找B[j],使A[i]和B[j]两者的差取得最小。
编程求最小差。要求:时间复杂度 O(nlogn)。
输入
有多组测试数据,每组有3行。
每组的第1行是一个整数,(n<=10000)。接着有2行,每行上有个数为n的整数序列,分别表示数组A和B。
输出
对每组测试数据中的两个整数数组 A 和 B,输出所要求的最小差。
样例输入
4
3 4 6 7
2 3 8 9
样例输出
0
#include <iostream>
#include <vector>
#include <algorithm>
void Minimum_Differen(std::vector<int> nums_a, std::vector<int> nums_b)
{
int min = abs(nums_a[0]-nums_b[0]);
for (int i = 0; i < nums_b.size(); i++)
{
int left = 0;
int right = nums_a.size() - 1;
int mid;
while (left <= right)
{
mid = (left + right) / 2;
if (nums_b[i] > nums_a[mid])
{
left = mid + 1;
}
else if (nums_b[i] < nums_a[mid])
{
right = mid - 1;
}
else if (nums_b[i] == nums_a[mid])
{
std::cout << 0 << std::endl;
return;
}
}
int temp_min;
if(left == 0 )
{
temp_min = abs(nums_a[left]-nums_b[i]);
if(min>temp_min)
{
min = temp_min;
}
}
else
{
temp_min = abs(nums_a[left]-nums_b[i]) > abs(nums_a[left-1]-nums_b[i]) ? abs(nums_a[left-1]-nums_b[i]) : abs(nums_a[left]-nums_b[i]);
}
if(min>temp_min)
{
min = temp_min;
}
}
std::cout << min <<std::endl;
return;
}
void mindif(std::vector<int> nums_a, std::vector<int> nums_b)
{
int min = abs(nums_a[0] - nums_b[0]) ;
for(int i =0;i<nums_a.size();i++)
{
for(int j=0;j<nums_b.size();j++)
{
if(abs(nums_a[i]-nums_b[j])<min)
{
min = abs(nums_a[i]-nums_b[j]);
}
}
}
std::cout<<min<<std::endl;
}
int main()
{
int nums_length;
while (std::cin >> nums_length)
{
std::vector<int> nums_a;
std::vector<int> nums_b;
int num;
for (int i = 0; i < nums_length; i++)
{
std::cin >> num;
nums_a.push_back(num);
}
for (int i = 0; i < nums_length; i++)
{
std::cin >> num;
nums_b.push_back(num);
}
std::sort(nums_a.begin(), nums_a.end());//其实并没排好序
//std::sort(nums_b.begin(),nums_b.end());
Minimum_Differen(nums_a, nums_b);
//mindif(nums_a,nums_b);
}
return 0;
}