想起来最近宿舍楼门口贴的那张海报了,说是有一个csdn高校俱乐部的编程挑战赛,那今天我就做做看吧。
像一般这种都是从最简单的开始的,那为了找找感觉,我们也从第一题开始。
第一题:
题目很简单,完成函数reverse,要求实现把给定的一个整数取其相反数的功能,举两个例子如下: x = 123, return 321 x = -123, return -321
这个要做的就是先判断是不是负数,然后把每位的数字都提取出来 。
int reverse(int num){
int num2=0;
while(abs(num)>0){
num2+=num%10;
num/=10;
if(num%10!=0)
num2*=10;
}
if(num<0){
num2*=-1;
}
return num2;
}
恩,第一题轻松过关
第二题:
有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。 可以进行的操作是: 把一个容器灌满; 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸); 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。 问是否能够通过有限次操作,使得水缸最后恰好有C升水。 输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000 输出:0或1,表示能否达到要求。 函数头部: c语言:1表示可以,0表示不可以 int can(int a,int b,int c); c++语言: true表示可以,false表示不可以 bool can(int a,int b,int c); java语言:true表示可以,false表示不可以 public class Main { public static boolean can(int a,int b,int c); }
这个是其实翻译过来就是求ab的最大公约数。翻译的太快了,在近一点的翻译就是,是否存在两个数x y,使得ax+by=c,a和b的最大公约数也是他们之间通过减运算能够达到的最小的数值。这种问题里边最小的数是最重要的,因为这个数才决定了最后能不能达到c升水。
第三题
我们要给每个字母配一个1-26之间的整数,具体怎么分配由你决定,但不同字母的完美度不同, 而一个字符串的完美度等于它里面所有字母的完美度之和,且不在乎字母大小写,也就是说字母F和f的完美度是一样的。 现在给定一个字符串,输出它的最大可能的完美度。 例如:dad,你可以将26分配给d,25分配给a,这样整个字符串最大可能的完美度为77。 函数头部 C int perfect(const char *s); C++ int perfect(const string &s); java public static int perfect(String s);
这个翻译过来就是统计字符出现的次数和不同字符的个数,最多的分配为26,依次递减,不用在意哪个出现的最多。
#include<stdio.h>
#include<math.h>
int perfect(const char *s){
int i,j;
int temp;
int sum=26;
int result=0;
int per[26]={0};
for(i=0;s[i];i++){
if(s[i]>=97&&s[i>=122]){
per[s[i]-97]++;
}
else{
per[s[i]-65]++;
}
}
for(i=0;i<25;i++){
for(j=i;j<26;j++){
if(per[j]>per[i]){
temp=per[i];
per[i]=per[j];
per[j]=temp;
}
}
}
for(i=0;per[i];i++){
result+=per[i]*sum;
sum--;
}
return result;
}
很轻松 一次就a了