牛客网——2017校招真题在线编程(python&C++)
题目描述
找出n个数里最小的k个
输入描述:
每个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n 不超过100。
输出描述:
输出n个整数里最小的k个数。升序输出
示例1
输入
3 9 6 8 -10 7 -11 19 30 12 23 5
输出
-11 -10 3 6 7
python3:
def findminK(arr,K):
res = sorted(arr)
return res[:K]
if __name__ == "__main__":
try:
while True:
arr = [int(t) for t in input("").split()]
print(" ".join(str(i) for i in findminK(arr[:-1],arr[-1])))
except:
pass
2、求数列的和
题目描述
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
输入描述:
输入数据有多组,每组占一行,由两个整数n(n < 10000)和m(m < 1000)组成,n和m的含义如前所述。
输出描述:
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
示例1
输入
81 4 2 2
输出
94.73 3.41
Python代码:
import sys
import math
def getSum(num1, num2):
sum = 0
if num1 < 0 or num1 >= 10000:
return sum
if num1 == 0:
return sum
if num2 <= 0 or num2 >= 1000:
return -1
if (num1 > 0 and num1 < 10000) and (num2 > 0 and num2 < 1000):
sum = num1
for i in range(num2-1):
sum = sum + math.sqrt(num1)
num1 = math.sqrt(num1)
return sum
if __name__ == '__main__':
try:
while True:
arr1 = [int(t) for t in sys.stdin.readline().split()]
arr2 = [int(t) for t in sys.stdin.readline().split()]
print("%.2f" % getSum(arr1[0], arr1[1]))
print("%.2f" % getSum(arr2[0], arr2[1]))
except:
pass
3、水仙花数,见博客:在线编程——水仙花数
4、分苹果
题目描述
n 只奶牛坐在一排,每个奶牛拥有 a
i 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。
输入描述:
每个输入包含一个测试用例。每个测试用例的第一行包含一个整数 n(1 <= n <= 100),接下来的一行包含 n 个整数 ai(1 <= ai <= 100)。
输出描述:
输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出 -1。
示例1
输入
4 7 15 9 5
输出
3
C++代码:
#include <iostream>
using namespace std;
int main()
{
int num;
cin>>num;
int a[num];
long long sum = 0,count = 0;
for(int i=0;i<num;i++){
cin>>a[i];
sum += a[i];
}
bool flag = true;
if(sum%num == 0){
int average = sum/num;
for(int i=0;i<num;i++){
if(a[i] > average){
if((a[i]-average)%2 == 0){
count += (a[i]-average)/2;
}
else{
flag = false;
break;
}
}
}
}
else
flag = false;
if(flag){
cout<<count<<endl;
}
else
cout<<"-1"<<endl;
return 0;
}
5、数字翻转
题目描述
对于一个整数X,定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如:
如果 X = 123,则rev(X) = 321;
如果 X = 100,则rev(X) = 1.
现在给出整数x和y,要求rev(rev(x) + rev(y))为多少?
如果 X = 123,则rev(X) = 321;
如果 X = 100,则rev(X) = 1.
现在给出整数x和y,要求rev(rev(x) + rev(y))为多少?
输入描述:
输入为一行,x、y(1 ≤ x、y ≤ 1000),以空格隔开。
输出描述:
输出rev(rev(x) + rev(y))的值
示例1
输入
123 100
输出
223
python代码:
def rev(num):
tmp = []
sum = 0
for i in range(len(str(num))):
tmp.append(num//pow(10,i)%10)
sorted(tmp)
for i in range(len(tmp)):
sum += tmp[len(tmp)-i-1]*pow(10,i)
return sum
if __name__=='__main__':
try:
while True:
arr = [int(t) for t in input('').split()]
print(rev(rev(arr[0])+rev(arr[1])))
except:
pass
题目描述
输入n个整数,输出出现次数大于等于数组长度一半的数。
输入描述:
每个测试输入包含 n个空格分割的n个整数,n不超过100,其中有一个整数出现次数大于等于n/2。
输出描述:
输出出现次数大于等于n/2的数。
示例1
输入
3 9 3 2 5 6 7 3 2 3 3 3
输出
3
python3代码:
def getCondNumber(arr):
res = []
if len(arr)==1:
res.append(arr[0])
return res
sorted(arr) #排序
arr1 = list(set(arr)) #去重复
for i in range(len(arr1)):
count = 0
for j in range(len(arr)):
if arr1[i]==arr[j]:
count+=1
if count>=len(arr)/2:
res.append(arr1[i])
return res
if __name__=='__main__':
try:
while True:
arr = [int(t) for t in input('').split()]
res = getCondNumber(arr)
print(" ".join(str(i) for i in res))
except:
pass
7、素数对
题目描述
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
输出描述:
输出对数
示例1
输入
10
输出
2
python3代码:
import math
def isPrime(num):
if num > 1:
for i in range(2, int(math.sqrt(num))+1):
if (num % i) == 0:
return False
break
else:
return True
else:
return False
def getPrimeNumber(num):
count = 0
for i in range(2, num//2+1):
if isPrime(i) and isPrime(num - i):
count += 1
return count
if __name__ == '__main__':
try:
while True:
num = int(input(""))
res = getPrimeNumber(num)
print(res)
except:
pass