>第 6 章 循环语句>while语句>习题

刘艳明 lonny_liu@hotmail.com
2009-04-04 22:07:30

宋老师,你好!
请问递归的习题fib序列,怎么用循环语句来写
想了好久没有想出来,请赐教


sunlick xxx@gmail.com
2009-06-01 18:08:55

#include <stdio.h>

void factorial(int n)
{
        int result = 1;
        int i;
        if(n == 0)
        {
                return 1;
        }
        for(i=1;i<n+1;i++)
        {
                result = result*i;
        }
        printf("%d",result);
}
int main(void)
{
        factorial(10);
}


是这样的?


effeee effeee@126.com
2009-06-30 16:06:36

2、编写程序数一下1到100的所有整数中出现多少次数字9。
#include<stdio.h>
int main(void)
{
        int n=0;
        int res=0;
        while(n++<100)
        {
                if(n%10 == 9)
                {
                        res++;
                }
        }
        printf("%d\n",res);
        return 0;
}


bcyx bc_yx@163.com
2009-08-04 23:43:08

请指点
/* 数一下1到100的所有整数中出现多少次数字9 */
#include "stdio.h"
int sum9(void)
{
   int n=1,i=0;            /*初始整数为n,数字9出现的个数为i*/
   while(n<100){           /*最大整数为100,因为100没有出现数字9,所以没写为n<=100*/
   	if(n%10==9) i=i+1;     /*个位上含数字9的*/
   	if(n%100-n%10==90) i=i+1; /*十位上含数字9的,n%100-n%10==90也可(n%100-n%10)/10==9*/
    	n=n+1; }
   return i;
}
int main(void)
{
	printf("The number '9' appears %d times.\n",sum9());
	return 0;
}


码匠 code_smith@sohu.com
2009-09-02 13:48:35

#include <stdio.h>

int no9(int n)
{
	int sum=0;
	int i=1;
	while(i<=n)
	{
		if(i%10==9) sum++; 
		if(i/10%10==9) sum++;
		i++;
	}
	return sum;
}

int main(void)
{
	printf("no9(100) = %d\n", no9(100));
	printf("no9(80) = %d\n", no9(80));
	
	return 0;
}


tianyebj tianyebj@gmail.com
2009-09-20 21:18:19

第二题,1到100有多少个数字9:
#include <stdio.h>
int count(int n){
	int c = 0; // 9's count
	int a;// 个位数字
	int n_tmp = n;
	while(n > 0){
		a = n % 10;	
		if(a == 9) c++;
		n = n / 10;
		
	}
	printf("%d   %d\n", n_tmp, c);
	return c;
}
int main(void){
	int num = 0;
	int i;
	for(i = 1; i <= 100; i++){
		num += count(i);
	}
	printf("total 9: %d\n", num);
}


PQW 0216789abc@gamil.com
2009-11-18 00:46:36

#include <stdio.h>
int single_digit (int x)
{
	return x%10;
}
int ten_digit (int x)
{
	return x/10%10;
}
void main (void)
{
	int n=0,a=0;
	while (n++<=100) {
		if (single_digit(n)==9)
			a++;
		if (ten_digit(n)==9)
			a++;
		}
	printf ("%d\n",a);
}
老师您看还能不能再优化一下?


阿第 id_1800@yahoo.com.cn
2009-12-14 15:12:14

我来试一下:

#include <stdio.h>
#include <math.h>

int mac_9(int n)
{
        int i = 1;
        int j = 0;
        while ( i <= n )
        {
                if ( i%10 == 9 || i/100 ==9 || i/10 ==9 ) j = j++;
                i = i++;
        }
        return j;
}

int main(void)
{
        int y;
        printf("Please input (1-1000): ");
        scanf("%d", &y);
        int k=mac_9(y);
        printf("The number 9 (in 1-%d) appears %d times.\n", y, k);
        return 0;
}


Chen Yang chenyangyinpeng@gmail.com
2009-12-23 10:46:12

int fib_loop(int n)
{
	int fib0, fib1, fib, k, a, b;
	fib=0;
	fib0=1;
	fib1=1;
	
	if(n==0)
	{
		return fib0;
	}
	else if(n==1)
	{
		return fib1;
	}
	
	k=2;
	a=fib0;
	b=fib1;
	
	while(k<=n)
	{
		fib=a+b;
		b=a;
		a=fib;
		k=k+1;
	}
	
	return fib;
}


baidu874 baidu874@yahoo.com.cn
2010-01-20 17:31:54

我觉得我这样做结果也对,但是会有问题吗?数数字9的题目

#include <stdio.h>
void main()
{
        int i,j;
        i=0;
        j=0;
        while(i != 100){
                i = i+1;
                if (i%10==9)
                {
                        j=j+1;
                }

                if ((i/10)%10==9)
                {
                        j=j+1;
                }
}
printf("9 numbers are:%d\n",j);
}


zhaoys 4924545@163.com
2010-05-02 21:59:12

#include <stdio.h>

int main(void)
{
    int num=0,s,g,i;
    for(i=1;i<100;i++)   //可以从10开始,到99结束。设num的初值为1。
    {                    //if……else ……可以改为s=i%10;g=i/10;。
        if(i>10)
        {
            s=i%10;
            g=i/10;
        }
        else
            g=i%10;
        if(s==9 || g==9)
            num=num+1;

    }
    printf("%d\n",num);
    return 0;
}
哪一种方法效率高?


Andy Ho sixand@gmail.com http://sixand.typepad.com/
2010-06-11 03:07:50

我照着原来在递归里的习题改写成了用While循环的模式了。不知道这样可不可以。

[code]

#include <stdio.h>
int check_ex10(int n);
int Get_GCD(int a, int b);
int fib(int n);

int main(void)
{
	int a, b;
	scanf("%d %d" , &a , &b);
	printf("The %d Numbar Exists 9 \n",check_ex10(100));
	printf("a = %d , b = %d , GCD(a,b) = %d \nFibonacci number is %d\n" , a, b, Get_GCD(a, b) , fib(Get_GCD(a , b)));
	return 0;
}

int check_ex10(int n)
{
	int i=0;
	while(n != 8)
	{
		if(n % 10 == 9 || n % 100 == 9 || n / 10 == 9)
			i += 1;
		n--;
	}
	return i;
}

int Get_GCD(int a, int b)
{
	while(a % b != 0)
	{
		b = b % (a % b);
	}
	return b;
}

int fib(int n)
{
	while( n != 0 || n != 1 )
	{
		n = n - 1 + n - 2;
	}
	return n;
}


[/code]


some so@sss.cn
2010-09-06 23:52:58

#include<stdio.h>

int main(void)
{
	int i;
	i=1;
	while(i<=100)
	{if(i%10==9){
		printf("%d\n",i);
}
		i=i+1;}
		return 0;
}


sd44 sd44sd44@yeah.net
2010-10-19 02:10:36

习题1:

#include <stdio.h>
int euclid(int a,int b)
{
    int temp;
    while (a % b != 0) {
        temp = a % b;
        a = b;
        b = temp;
    }
    return b;
}

int fib(int n)
{
    int x = 2;
    int result;
    int first = 1;
    int second = 1;
    if (n == 1 || n == 0)
        result = 1;
    while (x <= n) {
        ++x;
        result = first + second;
        first = second;
        second = result;
    }
    return result;
}



sd44 sd44sd44@yeah.net
2010-10-19 23:11:12

习题2

#include <stdio.h>

int fact(int m)
{ 
	int x = 1;
	int times = 0;
	while (x <= 100)
	{
		if (x % 10 == m)
			++times;
		else if (x / 10 == m)
			++times;
		++x;
	}
	return times-1;
}

void main(void){
	printf("%d",fact(9));
}


sd44 sd44sd44@yeah.net
2010-10-19 23:26:52

我上面写错了一个地方

应当是return times;
而不是 times - 1

因为if/else ^__^并不存在99重复的情况



rufeng newingc@gmail.com http://www.xin-e.cc/
2011-01-08 23:40:11

老师没有举到汉诺塔的问题,我想知道如果把汉诺塔的问题用while来实现。。。。


rufeng newingc@gmail.com http://www.xin-e.cc/
2011-01-09 00:10:16

#include <stdio.h>

int main(void)
{
	int n = 10;
	int f1,f2,fib;
	f1 = f2 = fib = 1;
	while (n-- > 1) {
		f1 = f2;
		f2 = fib;
		fib = f1 + f2;
	}
	printf("fid:%d\n",fib);
}

用循环实现fib,这样子对吗?


贾俊涛 jiajuntao@126.com
2011-01-10 16:59:00

//习题一答案如下:

#include<stdio.h>

int euclib(int a,int b);
int fibonacci(int n);

int main(void)
{
	
	printf("%d\n",euclib(12,6));
	printf("%d\n",fibonacci(14));
	return 0;
}

int euclib(int a, int b)
{
	while(a%b != 0)
	{
		a = b;
		b = a%b;		
	}
	return b;
}

int fibonacci(int n)
{
	int result = 0;
	if(n < 0){
		printf("error,the number out of range!");
		return result;
	}
	int i=1;
	int last1 = 1,last2 = 1;
	while(i <= n){
		if(i ==1 || i == 2){
			result = 1;
		}else{
			result = last1 + last2;
			last1 = last2;
			last2 = result;	
		}
		i++;
	}
	return result;
}


xudonglee xudongleee@126.com
2011-01-19 19:25:38

//第二题
#include <stdio.h>

int print_num(int x)
{
  if((x / 10) == 9 && (x % 10) == 9)
        return 2;
  else if((x / 10) == 9 || (x % 10) == 9)
        return 1;
  else
        return 0;
}


int main(void)
{ 
  int i, a = 0;
  
  for(i = 0; i <= 100 ; i++)
  {
        a += print_num(i);
  }
  printf("There is %d numbers have 9.\n", a);
  
  return 0;
}


Output:
[root@node81 xudonglee]# ./a.out 
There is 20 numbers have 9.


xudonglee xudongleee@126.com
2011-01-19 19:43:30

各位不好意思,我的printf函数打印的信息存在问题,不是有多少个number里面含有9,是从1-100的书中9这个数字总共出现了20次,请见谅,谢谢!


谢艳 xieyan256@163.com
2011-02-17 19:59:57

宋老师您好,我想问一下,就是您说到的3X+1的问题,有个数113383我把它放到程序里去,用电脑算了很久也没算出来,是不是说明这个数可以导致这个算法导致死循环呢?如果不是,那要多长时间算不出来才能证明是死循环?谢谢!


赵昱 zy4668@126.com
2011-05-05 20:03:10

第二个习题我感觉最难,终于实现了,和上面的类似,但是还是十分高兴,贴出来,多提意见:
int fib(int n)
{
  int x=0,j=0,k=1,sum=0;
    if(n==0)
      sum=1;
   else{
  while(x<n)
  {  
    x++;
    sum=j+k;
    j=k;
    k=sum;
  }
  }
   return sum;
}

int main(void)
{
  do
   {
  printf("please enter a positive number\n");
  scanf("%d",&n);
   }
  while(n<0)
  printf("fib is :%d\n",fib(n));
}


江民 vipstepstep@163.com
2011-05-18 08:50:07

# include <stdio.h>

int sum_nine(void) {
	int n = 1, i = 0;

	while(n <= 100) {
		if(9 == n % 10 || 9 == n / 10) {
			printf("n = %d ", n);
			++i;
		}
		++n;
	}
	printf("\n");

	return i;
}

int main(void) {
	int result = 0;

	result = sum_nine();

	printf("The number '9' appears %d times.\n", result);

	return 0;
}


邹恒毅 zouhy_1987@yahoo.com.cn
2011-06-29 17:33:16

#include <stdio.h>

int count()
{
        int c=0;
        int n=1;
        while(n<100){
                if(n%10==9)
                        c++;
                if((n-9)/10==9)
                        c++;
                n++;
        }
        return c;
}
int main(void)
{
        count();
        printf("The number 9 appears %d times between 1 and 100 ",count());
        return 0;
}


ivon yifeng.ivon.wang@hotmail.com
2011-11-17 10:01:49

/*
06.1.2
使用循环编写函数求Fibonacci数列的第n项,这个数列是这样定义的:
fib(0)=1
fib(1)=1
fib(n)=fib(n-1)+fib(n-2)
0	1	2	3	4	5	6	7
1	1	2	3	5	8	13	21
*/

#include <stdio.h>

int fibonacci(int x)
{
	int temp ;

	if(x==0||x==1)
	{
		return 1 ;
	}
	else
	{
		int count1 = 1 ;
		int count2 = 1 ;

		while(x>1){
		count2 = count1 + count2 ;
		//printf("%d\n", count2) ;
		count1 = count2 - count1 ;
		//printf("%d\n", count1) ;
		x = x-1 ;
		//printf("%d\n", x) ;
		}
		return count2 ;
	}	
}

int main(void)
{
	int i ;
	int j ;

	printf("Please input a number.\n") ;
	printf("Number=") ;
	j = scanf("%d", &i) ;

	if(j == 1)
	{
		if(i >= 0)
		{
			j = fibonacci(i) ;
			printf("Number=%d\n", j) ;
		}
		else
		{
			printf("It is NOt a correct input!\n") ;
		}

	}
	else
	{
		printf("It is NOt a correct input!\n") ;
	}

	return 0 ;
}


ivon yifeng.ivon.wang@hotmail.com
2011-11-17 10:02:40

/*
06.1.1
使用循环编写函数求两个正整数a和b的最大公约数(GCD,Greatest Common Divisor),使用Euclid算法:
如果a除以b能整除,则最大公约数是b。
否则,最大公约数等于b和a%b的最大公约数。
最后,修改你的程序使之适用于所有整数,而不仅仅是正整数。
*/

#include <stdio.h>
#include <math.h>

int gcd(int i, int j)
{
	while(i%j != 0){
		j == j-1 ;
	}

	return j ;
}

int main(void)
{
	int temp ;
	int i ;
	int j ;

	printf("Please input two numbers.\n") ;
	printf("I=") ;
	temp = scanf("%d", &i) ;
	
	if(temp != 1){
		printf("It is NOt a correct input!\n") ;	
	}
	
	printf("J=") ;
	temp = scanf("%d", &j) ;
	
	if(temp != 1){
		printf("It is NOt a correct input!\n") ;	
	}

	i = abs(i) ;
	j = abs(j) ;

	if(i<j){
		temp = i ;
		i = j ;
		j = temp ;
	}

	temp = gcd(i, j) ;
	printf("GCD=%d\n", temp) ;

	return 0 ;
}


ivon yifeng.ivon.wang@hotmail.com
2011-11-17 10:03:20

/*
06.1.3
编写程序数一下1到100的所有整数中出现多少次数字9。在写程序之前先把这些问题考虑清楚:

这个问题中的循环变量是什么?

这个问题中的累加器是什么?用加法还是用乘法累积?

在第 2 节 “if/else语句”的习题1写过取一个整数的个位和十位的表达式,这两个表达式怎样用到程序中?
*/

#include <stdio.h>

int main(void)
{
	int i = 1 ;
	int count = 0 ;

	while(i<100){
		if(i/10 == 9){
			count = count + 1 ;
		}
		
		if(i%10 == 9){
			count = count + 1 ;
		}
		i = i + 1 ;
	}

	printf("%d\n", count) ;

	return 0 ;
}


caozhijie czj627@126.com
2011-12-27 19:09:40

求1-100中9的个数
六楼:tianyebj tianyebj@gmail.com
2009-09-20 21:18:19
的程序较好
原因:它(程序)的思路是求1-N中9的个数, N为正整数。
而其他程序都局限在100这个数字上。


caozhijie czj627@126.com
2011-12-27 19:47:55

那个113383 的问题是
113383这个数超出int的表示范围了


wangzhengyi 15866883396@126.com
2012-01-18 22:29:22

#include <stdio.h>
#include <stdlib.h>

int geweishu(int y){
	int n=0,x;
	x=y%10;
	if(x==9)
		n++;
	return n;
}

int shiweishu(int y){
	int n=0,x;
	x=y%100;
	x=x/10;
	if(x==9) n=1;
	return n;
}

int main(){
	int n=0,x=1,n1,n2;
	while(x<=100){
		n1=geweishu(x);
		n2=shiweishu(x);
		n=n+n1+n2;
		x++;
	}
	printf("The number of 9 is %d",n);
	system("pause");
	return 0;
}


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!