问题引入:输入一个数,输出这个数的位数。
考虑用while循环去做:
#include
int main(){
int i=0;
int x;
scanf("%d", &x);
i++; //这两条语句是满足输入0时的情况,无论输入是什么都先给计数器i加一
x /= 10;
while(x > 0){
i++;
x /= 10; //通过不断除以10划去最右边的一位数,并使i加一
}
printf("%d\n", i);
return 0;
}
考虑用do while循环去实现:
#include
int main(){
int i=0;
int x;
scanf("%d", &x);
do{
i++; //使用do while循环可以使得不论输入什么数字都先执行一次循环体
x /= 10;
}while(x>0); //当括号内的条件满足时继续循环。
printf("%d\n", i);
return 0;
}
问题:输入一个数字n,输出n的阶乘。
用while循环是这样实现的:
#include
int main(){
int i = 1;
int fact = 1;
int n;
scanf("%d", &n);
while(i <= n){
fact *= i;
i++;
}
printf("%d\n", fact);
return 0;
}
用for循环是这样实现的:
#include
int main(){
int i;
int fact = 1;
int n;
scanf("%d", &n);
for(i = 1; i <= n; i++ ){
fact *= i;
}
printf("%d\n", fact);
return 0;
}
循环变量i只在for循环内部使用了,所以我们可以将i的定义放在for循环内部,这只在C99中被允许。
即:for(int i = 1; i <= n; i++){}
另外的一个改进就是既然乘以1等于不乘,我们就可以使i从2开始递增,这样可以少跑一轮循环。
for中的每一个表达式都是可以省略的,而for(;条件;)==while(条件)
最后,如果有固定的循环次数,用for循环;如果必须执行一次的话用do-while;其他情况的话就用while。
题一:编程实现如下函数的累加
#include
int main(){
int n;
int i;
double func = 1.0;
scanf("%d", &n);
for(i=2; i<=n; i++){
func += 1.0/i;
}
printf("f(n)=%f\n", func);
return 0;
}
题二:若函数为下式则有:
#include
int main(){
int n;
int i;
double func = 1.0;
scanf("%d", &n);
for(i=2; i<=n; i++){
if(i%2 == 0)
func += -1.0/i;
else func += 1.0/i;
}
printf("f(n)=%f\n", func);
return 0;
}
//或者这样
#include
int main(){
int n;
int i;
double func = 1.0;
double sign = -1;
scanf("%d", &n);
for(i=2; i<=n; i++){
func += 1.0*sign/i;
sign = -sign; //直接设置一个标志每次循环取反
}
printf("f(n)=%f\n", func);
return 0;
}
题三:正序分解整数:输入一个非负整数,正序输出它的每一位数字
一般的思路可以是先将整数逆序,然后逐个取各位数输出,但是不适合末尾是0的整数。将整数逆序的程序实现如下:
#include
int main(){
int x;
int t=0;
scanf("%d", &x);
do{
int d = x%10;
t = t*10+d; //记录逆序后的t值
x /= 10;
}while(x>0);
printf("%d", t);
return 0;
}
//所以正确的实现方法为设置一个mask解决
#include
int main(){
int x;
int i;
int mask = 1;
int t;
int d;
scanf("%d", &x);
t = x;
//先求得mask的值,利用求整数位数的小程序
do{
t /= 10;
mask *= 10;
}while(t > 9);
// printf("%d\n", mask);
//正序输出各位数小程序
do{
d = x/mask;
printf("%d", d);
if(x > 9) //处理最后需要输出的空格,即只允许x不是各位数时才输出空格。
printf(" ");
x %= mask;
mask /= 10;
}while(mask > 0);
printf("\n");
return 0;
}
题四:求最大公约数
方法一:穷举法
#include
int main(){
int a, b;
int min;
int ret;
int i;
scanf("%d %d", &a, &b);
if(a < b) min = a;
else min = b;
for(i=min; i>1; i--){
if(a%i == 0){
if(b%i == 0){
ret = i;
break;
}
}
}
printf("%d", ret);
return 0;
}
方法二:辗转相除法
算法描述:1、如果b等于0,计算结束,a就是最大公约数 2、否则,计算a除以b的余数,让a等于b,而b等于那个余数 3、回到第一步。
#include
int main(){
int a, b;
int t;
int ret;
scanf("%d %d", &a, &b);
do{
t = a%b;
a = b;
b = t;
}while(b != 0); //循环终止条件是b==0
ret = a;
printf("%d\n", ret);
return 0;
}