没有空白的C语言
其实我一直是对“滥用”C语言特性的行为十分感兴趣。虽然不属于正常的编程。只是作为程序猿的自娱自乐。。。
不过特别有意思的啊。。。
今天中午在校内OJ上刷了几道C语言基础题,题目仅仅是给那些C语言的新手做的。不过我加入了限制条件:不能用空白字符,包括空格,回车和Tab键。
C语言一下子变得有趣了有木有。
下面我把今天写的题目和代码贴上来:
题目1
Description
求
s=a+aa+aaa+aaaa+aa...a
的值,其中a
是一个一位的整数。 例如2+22+222+2222+22222
(此时共有5个数相加)
Input
整数
a
和n
(n
个数相加,1<= n, a<=9
)
Output
s
的值
Sample Input
1 | 2 2 |
Sample Output
1 | 24 |
我的代码:
1 | a,n,s,p,i;main(){scanf("%d%d",&a,&n);for(;i<n;i++){p=p*10+a;s+=p;}printf("%d",s);} |
题目2
Description
按如下递归公式求函数值。
x=1
时f(x)=10
;x>1
时f(x)=f(x-1)+2
Input
整型变量
x
Output
f(x)
Sample Input
1 | 10 |
Sample Output
1 | 28 |
我的代码:
1 | x;f(__typeof__(int)a,__typeof__(int)n){if(n<=0)return(0);if(n==1)return(a+10);return(f(a+2,n-1));}main(){scanf("%d",&x);printf("%d",f(0,x));} |
题目3
Description
求矩阵的两对角线上的元素之和
Input
矩阵的行数
N
; 和一个N*N
的整数矩阵a[N][N] (N<=10)
Output
所输矩阵的两对角线上的元素之和
Sample Input
1 | 3 |
Sample Output
1 | 25 |
我的代码:
1 | n,a[10][10],u,i;void*s(){u=0;for(i=0;i%lt;n;i++){u+=a[i][i];u+=a[i][n-1-i];}return(0);}main(){scanf("%d",&n);for(;i<n;i++)for(u=0;u<n;u++)scanf("%d",&a[i][u]);s();if(n%2!=0)u-=a[n/2][n/2];printf("%d",u);} |
题目4
Description
求出
1-N
中的所有素数
Input
大于
1
的正整数N
Output
1-N
中的所有素数,(以从小到大的格式输出)
Sample Input
1 | 9 |
Sample Output
1 | 2 3 5 7 |
我的代码:
1 | n,b=1,i;p(__typeof__(int)a){while(1){a++;for(i=2;i<sqrt(a);i++)if(a%i==0)break;if(i>sqrt(a))return(a);}}main(){scanf("%d",&n);while((b=p(b))<n)printf("%d%c",b,0x20);} |
方法总结
基本思路
- 标准库文件不需要
#include
导入,编译器会进行正确的猜测。 - 没有定义类型的变量将被视为
int
类型。如果这个变量是全局变量,它会被初始化为0。 - 没有定义返回类型的函数将被视为具有
int
返回类型。 - C语言中运算符可以通过括号和后面的待运算数区分开。比如
return 0;
可以写成return(0);
- 标准库文件不需要
消除变量定义空格
- 默认变量为整数形式,直接在最前面定义为全局变量,这样不需要
int a
中间的空格,直接写为a即可。 - 利用“
*
”:定义 【char*a,b;
】这样引入了一个没用的指针a
,但是可以不需要空格就定义char b
。
- 默认变量为整数形式,直接在最前面定义为全局变量,这样不需要
消除
struct
定义空格利用typedef
,typedef int MT
可以写作int typedef MT
,(MT为自定义的数据类型)。使用类似这样的写法:
1
struct{int*n,*p,a,b;char*a,b;}typedef*MP,MT;
这样你就有了一个名字为
MT
的struct
,和一个名字为MP
的MT
类型指针。(为什么要定义这个指针?请参照1.2)。消除函数形参表中的空格
最麻烦的可能在函数形参表这里。比如一个函数
void fun(int a, int b);
。如何去掉形参表中int a
里的这个空格呢?只要使用
typeof
关键字即可。上边的函数可以定义作void*fun(typeof(int)a,typeof(int)b);
但是当我今天把这样的代码提交到OJ上时,被判为CE。经查找资料而得,ISO C需要加上双下划线,写作:
__typeof__(int)
字符串中的空格真的碰到字符串里面需要空格了。你只需要用
0x20
这个ASCII码值代替它就好了。就像我上边第4题的输出做的那样。