牛客网——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