c语言编程题教解,三道c语言编程题解

高校俱乐部校园编程高手链接:

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; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值