一些零碎的知识补充
- typedef是一个关键字,可以用来给类型起别名
#include<stdio.h>
int main()
{
typedef int INT;
INT a=0;
printf("%d\n",a);
return 0;
}
- EOF为文件结尾标识符
- continue一定出现在循环中
- define是编译器的关键字,用于预处理,不是C语言的
i=a,b,c
与i=(a,b,c)
是不一样的,前者 i 的结果是c,后者 i 的结果是a
一些题目
求水仙花数
请输出所有的水仙花数。 所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。
例如,153是水仙花数,因为153=1^3 + 5^3 + 3^3。
思路:先把三位数拆开再用if限定水仙花数
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
for(i = 100; i <= 999; i++)
{
int a = i / 100, A = pow(a, 3);//求出i的百位数并立方
int b = i / 10 - a * 10, B = pow(b, 3);//求出i的十位数并立方
int c = i % 10, C = pow(c, 3);//求出i的个位数并立方
if(i == A + B + C)
{
printf("%d\n", i);
}
return 0;
}
- pow函数是给变量乘方的函数,格式为pow(a, b),表示a的b次方
- if括号内可以替换成
i == a*a*a + b*b*b + c*c*c
,但是不能用^,因为它在C语言中是异或运算符 - if括号后一定不能加分号,因为这样相当于if语句控制了一条空语句,就没有起到限定的作用
输出100~200之间所有的素数
思路:
-
假设一个数 i,用2 ~ i-1(根号 i 更优)的数一个个试,如果有一个能够整除,那就不是素数
-
用if语句试出非素数后,过滤掉它们,打印出剩下的数
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
for(i = 101; i <= 199; i += 2)
{
int flag = 1;
int j = 0;
for(j = 2; j <= sqrt(i); j++)
{
if(0 == i%j)//判断是否有除了1和i外的数整除i
{
flag = 0;//如果有,flag就为0,不打印
break;//如果有可以整除的,提前跳出循环
}
}
if (flag)//对于i=101,试完了所有j没有可以整除的,循环完毕,flag=1
{
printf("%d ", i);
}
}
return 0;
}
int flag = 1
一句只能放在for循环里,不能放在外面,不然只能输出101和103,因为在判断到105时,flag的值变成了0,如果没有给它重新赋上1,它就一直是0,后面的素数就都打印不出来了- 此处限定 j 最大为根号 i ,以及设置 i +=2,可以大大减少要测试的数据,是程序的优化
- if语句的后面最好打上大括号
计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
思路:表示出1/i,逢单相加逢双相减
#include<stdio.h>
int main()
{
int i = 1;
float sum = 0;
for(i = 1; i <= 100; i++)
{
float j = 1.0 / i;//这里的1必须带小数点
if(0 == i % 2)
sum -= j;
else
sum += j;
}
printf("%f", sum);
return 0;
}
- 这里的
float j = 1.0 / i;
也不能放在外面,否则就变成了1-1+1-1…-1(100个),最终结果为0.000000 - 整数相除是先取整数部分再转化为浮点数,所以如果没有写小数点,最终结果就是1-0+0-…-0,最终结果为1.000000
在屏幕上打印九九乘法表
思路:用两个循环,第一个循环中的a乘上第二个循环中的b
#include<stdio.h>
int main()
{
int a = 0;
for(a = 1; a <= 9; a++)
{
int b = 0;
for(b = 1; b <= 9; b++)
{
printf("%d * %d = %d ", a, b, a*b);
if(a == b)
{
printf("\n");
break;
}
}
}
return 0;
}
- 此处的break让该代码直接跳到a++阶段,就可以从2*2=4处换行跳到3,从而使得乘法表呈三角形,更加美观
编写程序数一下 1到 100 的所有整数中出现多少个数字9
思路:遇到9计数器就+1
#include<stdio.h>
int main()
{
int i = 0;
int count = 0;
for(i = 1; i <= 99; i++)
{
if(i / 10 == 9)
count++;
if(i % 10 == 9)
count++;
}
printf("%d", count);
return 0;
}
- 其中的两个if不能合并,不然99只会算到一个9
写代码将三个整数数按从大到小输出
思路:认为把大小顺序换成a>b>c,如果a更小就把a换成更大的数
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
while(scanf("%d %d %d", &a, &b, &c)!= EOF)
{
if(a < b)
{
int x = a;
a = b;
b = x;
}
if(a < c)
{
int y = a;
a = c;
c = y;
}
if(b < c)
{
int z = b;
b = c;
c = z;
}
printf("%d %d %d", a, b, c);
}
return 0;
}
- 此处
while(scanf("%d %d %d", &a, &b, &c)!= EOF)
是多组输入(下面要打大括号但是后面不能有分号) - 注意这个printf函数如果放在while语句的外面,就会导致要按ctrl+Z强制结束读取后才能出结果(因为只要有输入while语句的条件一直都符合)