1.宏替换不占用运行时间。宏替换是在编译时,编译器完成的。占用编译时间。
编译时,编译器会将代码中的宏用对应定义好的代码进行直接替换,然后再对源代码进行编译。
所以宏比函数在运行时更快,因为它不用像函数调用时,要对现有数据进行入栈保存,运行完后,在出栈恢复;它是直接编译好的代码。
2.将运算符和变量结合在一起,成为表达式。
3.小光棍shu
最近Topcoder的XD遇到了一个难题,倘若一个数的三次方的后三位是111,他把这样的数称为小光棍数。他已经知道了第一个小光棍数是471,471的三次方是104487111,现在他想知道第m(m<=10000000000)个小光棍数是多少?
(本题只要最后是471即可);
#include <stdio.h>
#include <stdlib.h>
#define LL long long
int main()
{
LL t,i,j,k;
LL m,n;
scanf("%lld",&t);
for(i=0;i<t;i++){
scanf("%lld",&m);
printf("%lld\n",471+1000*(m-1));
}
}
4.编写一个C程序,实现两个分数的加减法
输入包含多行数据
每行数据是一个字符串,格式是"a/boc/d"。
其中a, b, c, d是一个0-9的整数。o是运算符"+“或者”-"。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100
int f1(int k,int t) //寻找最大公因数
{
int m,n,i,j;
for(i=k;i>=1;i--)
if(k%i==0&&t%i==0) break;
return i;
}
int main()
{
int t,i,j,k;
int m,n;
char s[N];
char *p;
int a,b,c,d;
while(scanf("%s",s)!=EOF)
{
p=s;
for(i=1;*p;i++) //给a,b,c,d赋值,并且给找正负(m);
{
switch(i)
{
case 1:a=*p-48;break;
case 3:b=*p-48;break;
case 4:m=*p;break;
case 5:c=*p-48;break;
case 7:d=*p-48;break;
}
p++;
}
if(m==43)
k=a*d+c*b;
else if(m==45)
k=a*d-c*b;
t=b*d;
/*printf("a=%d\n",a);
printf("b=%d\n",b);
printf("m=%c\n",m);
printf("c=%d\n",c);
printf("d=%d\n",d);
printf("k=%d\n",k);
printf("t=%d\n",t);
system("pause");*/
if(k>0){
if(k<t){
n=f1(k,t);
if(n==1)
printf("%d/%d\n",k,t);
else
printf("%d/%d\n",k/n,t/n);
}
else if(k>t){
n=f1(t,k);
if(n==1)
printf("%d/%d\n",k,t);
else if(n==t)
printf("%d\n",k/t);
else
printf("%d/%d\n",k/n,t/n);
}
else
printf("1\n");
}
else if(k<0){
if(fabs(k)<t){
n=f1(fabs(k),t);
if(n==1)
printf("%d/%d\n",k,t);
else
printf("%d/%d\n",k/n,t/n);
}
else if(fabs(k)>t){
n=f1(t,fabs(k));
if(n==1)
printf("%d/%d\n",k,t);
else if(n==t)
printf("%d\n",k/t);
else
printf("%d/%d\n",k/n,t/n);
}
else
printf("-1\n");
}
else
printf("0\n");
/*printf("n=%d\n",n);
system("pause");*/
}
}