字符串的相关处理练习
3-3 乘积的末3位
主要在于EOF
的判断,以及清空缓冲区的处理(gcc编译器没有fflush(stdin)
)。
如果scanf
得到了错误的数值,返回值0
c
#include
#define MAXN 3000 int main() { int a; int b; int sum = 1; // EOF int值为-1 while(b != EOF) { b = scanf("%d", &a); if(b) sum = (sum * a) % 1000; else // 清空缓冲区 while ( getchar() != '\n' ); printf("sum: %d\n", sum); } return 0; }
3-4 计算器
c
#include
// 用于判断是否符号 int belong(char c) { switch(c) { case '+': return 1; case '*': return 1; case '-': return 1; default: return 0; } } int cal(int a1, int a2, char c) { if(c == '+') return a1 + a2; else if(c == '*') return a1 * a2; else if(c == '-') return a1 - a2; else return 0; } int main() { // 考虑使用fgets但是一行的字符不确定,所以放弃 int b; char c; int a1, a2; while(b != EOF) { b = scanf("%d", &a1); while((c = getchar()) != '\0') { if(belong(c)) break; } b = scanf("%d", &a2); int result = cal(a1, a2, c); printf("%d\n", result); } return 0; }
3-5 Matrix
旋转矩阵
c
#include#define sci(a) scanf("%d", &a) #define fori(a, b) for(i = a; i < b; i++) #define forj(a, b) for(j = a; j < b; j++) #define MAXN 1000 int n; // void trans(int a[][MAXN]) { int i, j; for(j = n-1; j >= 0; j--) { for(i = 0; i < n; i++) { printf("%5d", a[i][j]); } printf("\n"); } } void check(int a[][MAXN]) { int i, j; fori(0, n) { forj(0,n) printf("%5d", a[i][j]); printf("\n"); } } int main() { int i, j; int a[MAXN][MAXN]; while(~sci(n)) { for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { sci(a[i][j]); } } check(a); puts("trans: "); trans(a); } return 0; }
3-6 进制转换,10进制转换为b进制
求每次除以b得到的余数,反向输出余数即可。
c
#include
#include #define forj(a, b) for(j = a; j < n; j++) void trans(int b, int c) { int i; int tc = c; int a[100]; i = 0; while(tc != 0) { a[i] = tc % b; tc = tc / b; i++; } int j; for(j = i-1; j >= 0; j--) printf("%d", a[j]); printf("\n"); } int main() { int b; int c; while(~scanf("%d", &b)) { scanf("%d", &c); trans(b, c); } return 0; }
3-6 进制转换,包含大数
输入的数字为大数。主要依据是模拟手算。
因为test的时候调用了一次eval,结果调试的时候半天找不出错误。
c
#include
#include // 大数 /** * 模拟手算 * @param b, c * b为int型进制,c为大数 * @return rest */ int divide(int b , char *c) { int len = strlen(c); int i; int temp, rest; rest = 0; for(i = 0; i < len; i++) { temp = c[i] - '0'; rest = rest * 10 + temp; temp = rest / b; c[i] = temp + '0'; rest = rest % b; } return rest; } // 判断是否为0 int eval(char *c, char b) { int i = 0; int len = strlen(c); for(i = 0; i < len; i++) { if(c[i] != b) return 0; } return 1; } /** * 100位最大位数 */ // 用于测试 void output(char *c) { printf("---------------------output----------------------\n"); int i = 0; int len = strlen(c); for(i = 0; i < len; i++) { printf("%c", c[i]); } printf("\n"); printf("---------------------output----------------------\n"); } // 仅作测试 void test() { // 测试函数 char ss[] = "00"; int temp = eval(ss, '0'); int len = strlen(ss); printf("temp: %d, len: %d\n", temp, len); char n1[] = "10"; int n2 = 2; int re = divide(n2, n1); printf("str: %s\n", n1); printf("rest: %d\n", re); } void transCHAR(int b, char *c) { int a[100]; int i = 0; /* test(); */ /* output(c); */ while(!eval(c, '0')) { a[i] = divide(b, c); i++; } /* printf("i: %d\n", i); */ /* printf("b: %d\n", b); */ /* printf("s: %s\n", c); */ int j; for(j = i-1; j >= 0; j--) printf("%d", a[j]); printf("\n"); } int main() { int b; char a[100]; while(~scanf("%d", &b)) { scanf("%s", a); transCHAR(b, a); } return 0; }
3-7 进制转换2 b进制转换为10进制
c
#include
#include #include #define MAXN 1000 // 如果是大数 /** * c为数字,b为进制 */ void trans(char *c, int b) { // 输入数字不正确的可能处理没有添加 int len = strlen(c); int j, temp, tt; int res = 0; temp = pow(b, len-1); for(j = 0; j < len; j++) { tt = c[j] - '0'; res += tt * temp; temp /= b; } printf("%d\n", res); } int main() { int b; char c[MAXN]; while(~scanf("%d", &b)) { scanf("%s", c); trans(c, b); } return 0; }