高校俱乐部校园编程高手链接:
http://club.csdn.net/module/club/student/programming_challenges
本人做了其中几道题,已编译验证通过。高手帮忙指正和优化下呀。
/* 回文数
编程语言:C C++ Java C#
答题时长:120分钟
如果一个数正着读和反着读一样大,则这个数叫做回文数,例如121是回文数,123454321是回文数。 现给定一个正整数x,输出一个回文数y,要求y > x,并且组成x的所有数字之和与组成y的所有数字之和相等,以及y > x。 x在10^1000以内,因为数字较大,我们用字符串作为输入和输出。 如果无解,请输出Impossible。如果有多个y,输出最小的那个。 例如: 输入919,输出14941 输入1,输出Impossible
*/
#include
#include
#include
#define TRUE 1
#define FALSE 0
typedef int BOOL;
BOOL ishuwen(char t, char* s);
BOOL isfind(char* s, int n, int l, char* t, int count); int main(int argc, char* argv[]) {
//printf("Hello world argc = %d, argv[0] = %s\n", argc, argv[0]);
if (argc == 2) {
int l = strlen(argv[1]);
if (l > 1000) {
printf("argv[1] numble can not more than 1000");
return 1;
}
char mt = argv[1][0];
char* ms = (char*)malloc(l - 1);
strncpy(ms, &(argv[1][1]), l - 1);
BOOL b = ishuwen(mt, ms);
if (b == TRUE) {
//printf("%s is huwen\n", argv[1]);
} else {
//printf("%s is not huwen\n", argv[1]);
}
int count = 0;
int i = 0;
for (i = 0; i < l; i++) {
if (argv[1][i] >= '0' && argv[1][i] <= '9') {
count += argv[1][i] - '0';
}
}
//printf("result = %d\n", count);
if (strcmp(argv[1], "1") == 0) {
printf("%s is Impossible\n", argv[1]);
return 1;
}
int m, n;
char* num = NULL;
for (m = l; m < 1000; m++) {
printf("check %d: \n", m);
if (num != NULL) {
free(num);
num = NULL;
}
num = (char*)malloc(m);
if (isfind(num, 0, m, argv[1], count)) {
printf("%s is find\n", num);
return 0;
}
}
printf("%s is Impossible\n", argv[1]);
} else {
printf("argc numble only can be 2");
}
return 0;
}
BOOL ishuwen(char t, char* s) {
int len = strlen(s);
if (len == 1) {
if (t != s[len - 1]) {
return FALSE;
} else {
return TRUE;
}
}
if (t != s[len - 1]) {
return FALSE;
} else {
if (len - 1 == 1) {
return TRUE;
}
char tt = s[0];
char* ss = (char*)malloc(len - 2);
strncpy(ss, s + 1, len - 2);
return ishuwen(tt, ss);
}
return TRUE;
}
BOOL isfind(char* s, int n, int l, char* t, int count) {
int b = 0;
if (n == 0) {
b = 1;
} else {
b = 0;
}
if (n == l - 1) {
int j = 0;
for (j = b; j <= 9; j++) {
s[n] = '0' + j;
int c = 0;
int k = 0;
if (l == strlen(t)) {
BOOL re = FALSE;
for (k = 0; k < l; k++) {
if (s[k] > t[k]) {
re = TRUE;
} else if (s[k] < t[k]) {
break;
}
}
if (re == FALSE) {
return FALSE;
}
}
for (k = 0; k < l; k++) {
c += s[k] - '0';
}
if (c == count && ishuwen(s[0], &(s[1])) == TRUE) {
return TRUE;
}
}
return FALSE;
}
int i = 0;
BOOL bb = FALSE;
for (i = b; i <= 9; i++) {
s[n] = '0' + i;
bb = isfind(s, n + 1, l, t, count);
if (bb == TRUE) {
return TRUE;
}
}
return FALSE;
}
/*
人人code,整数取反
编程语言:C C++
答题时长:60分钟
难度等级:
题目很简单,完成函数reverse,要求实现把给定的一个整数取其相反数的功能,举两个例子如下: x = 123, return 321 x = -123, return -321
*/
#include
#include
#include
int main(int argc, char* argv[]) {
if (argc == 2) {
int c = strlen(argv[1]);
char* num = (char*)malloc(c + 1);
strncpy(num, argv[1], c);
num[c] = '\0';
int minus = 0;
if (num[0] == '-') {
minus = 1;
}
int i = 0;
int b = minus;
int isreal = 0;
for (i = b; i < c; i++) {
if ((num[i] >= '1' && num[i] <= '9' && i == b)
|| (num[i] >= '0' && num[i] <= '9' && i != b)) {
} else {
printf("invalidate real\n");
return 1;
}
}
char tmp;
for (i = b; i < c / 2; i++) {
tmp = num[i];
num[i] = num[c - 1 - i];
num[c - 1 - i] = tmp;
}
printf("result is %s \n", num);
} else {
printf("invalidate input\n");
}
return 0;
} /*
回文字符串
10 剩余时间:55天16小时30分04秒
编程语言:C C++ Java
答题时长:60分钟
难度等级:
回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串。 输入:非空仅由小写字母组成的字符串,长度不超过100; 输出:能组成的所有回文串的个数(因为结果可能非常大,输出对1000000007取余数的结果)。 例如:输入"aabb" 输出为2(因为“aabb”对应的所有回文字符串有2个:abba和baab) 函数头部 c: int palindrome(const char *s); c++ int palindrome(const string &s); java public static int palindrome(String s) ;
*/
#include
#include
#include
#define TRUE 1
#define FALSE 0
typedef int BOOL;
BOOL ishuwen(char t, char* s);
void getalpha(char* des, int cur, int tlen, const char* src, int* al, int alc, int* count) ;
int palindrome(const char *s);
int main(int argc, char* argv[]) {
int i = 0;
if (argc == 2) {
int c = strlen(argv[1]);
if (c > 100) {
printf("alphabet numble must be less than 100\n");
return;
}
for (i = 0; i < c; i++) {
if (argv[1][i] >= 'a' && argv[1][i] <= 'z') {
} else {
printf("invalidate input\n");
return 1;
}
}
int y = palindrome(argv[1]);
printf("the result is %d\n", y);
} else {
printf("invalidate input\n");
}
return 0;
}
int palindrome(const char *s) {
int al[26] = {0};
int i = 0;
int index = 0;
int c = strlen(s);
for (i = 0; i < c; i++) {
index = s[i] - 'a';
al[index]++;
}
char* alpha = (char*)malloc(c + 1);
alpha[c] = '\0';
int count = 0;
getalpha(alpha, 0, c, s, al, c, &count);
return count % 1000000007;
}
/* void getalpha1(char* des, int cur, int tlen, char* src, int* al, int alc, int* count) {
int len = strlen(src);
if (len == 1 && cur == tlen - 1) {
des[cur] = src[0];
char t = des[0];
char* s = des + 1;
if (ishuwen(t, s) == TRUE) {
printf("%s is huwen\n", des);
*count = *count + 1;
} else {
printf("%s is not huwen\n", des);
}
return;
}
int i = 0;
char* tmp = (char*)malloc(len - 1 + 1);
tmp[len - 1] = '\0';
//printf("1 tlen = %d src = %s\n", tlen, src);
for (i = 0; i < len; i++) {
des[cur] = src[i];
if (i == 0) {
strncpy(tmp, src + 1, len - 1);
} else if (i == len - 1) {
strncpy(tmp, src, len - 1);
} else {
strncpy(tmp, src, i);
strncpy(tmp + i, src + i + 1, len - 1 - i);
}
//printf("tlen = %d tmp = %s \n", tlen, tmp);
getalpha1(des, cur + 1, tlen, tmp, al, alc, count);
}
}
*/ void getalpha(char* des, int cur, int tlen, const char* src, int* al, int alc, int* count) { int len = strlen(src); if (alc == 1) { int i = 0; for (i = 0; i < 26; i++) { if (al[i] == 1) { des[cur] = 'a' + i; } } char t = des[0]; char* s = des + 1; if (ishuwen(t, s) == TRUE) { printf("%s is huwen\n", des); *count = *count + 1; } else { printf("%s is not huwen\n", des); } return; } int i = 0; int modenum = 0; for (i = 0; i < 26; i++) { if (al[i] > 0) { modenum++; } } int* alint = (int*)malloc(sizeof(int) * 26); int j = 0; int n = 0; for (i = 0; i < 26, n < modenum; i++) { if (al[i] > 0) { n++; des[cur] = 'a' + i; for (j = 0; j < 26; j++) { alint[j] = al[j]; } alint[i]--; getalpha(des, cur + 1, tlen, src, alint, alc - 1, count); } } } BOOL ishuwen(char t, char* s) { int len = strlen(s); if (len == 1) { if (t != s[len - 1]) { return FALSE; } else { return TRUE; } } if (t != s[len - 1]) { return FALSE; } else { if (len - 1 == 1) { return TRUE; } char tt = s[0]; char* ss = (char*)malloc(len - 2); strncpy(ss, s + 1, len - 2); return ishuwen(tt, ss); } return TRUE; }