宋老师,你好! 请问递归的习题fib序列,怎么用循环语句来写 想了好久没有想出来,请赐教
#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);
}
是这样的?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;
}请指点
/* 数一下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;
}#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;
}第二题,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);
}#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);
}
老师您看还能不能再优化一下?我来试一下:
#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;
}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;
}我觉得我这样做结果也对,但是会有问题吗?数数字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);
}
#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;
}
哪一种方法效率高?我照着原来在递归里的习题改写成了用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]#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;
}习题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;
}
习题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));
}我上面写错了一个地方 应当是return times; 而不是 times - 1 因为if/else ^__^并不存在99重复的情况
老师没有举到汉诺塔的问题,我想知道如果把汉诺塔的问题用while来实现。。。。
#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,这样子对吗?
//习题一答案如下:
#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;
}
//第二题
#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.各位不好意思,我的printf函数打印的信息存在问题,不是有多少个number里面含有9,是从1-100的书中9这个数字总共出现了20次,请见谅,谢谢!
宋老师您好,我想问一下,就是您说到的3X+1的问题,有个数113383我把它放到程序里去,用电脑算了很久也没算出来,是不是说明这个数可以导致这个算法导致死循环呢?如果不是,那要多长时间算不出来才能证明是死循环?谢谢!
第二个习题我感觉最难,终于实现了,和上面的类似,但是还是十分高兴,贴出来,多提意见:
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));
}# 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;
}#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;
}
/*
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 ;
}/*
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 ;
}
/*
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 ;
}
求1-100中9的个数 六楼:tianyebj tianyebj@gmail.com 2009-09-20 21:18:19 的程序较好 原因:它(程序)的思路是求1-N中9的个数, N为正整数。 而其他程序都局限在100这个数字上。
那个113383 的问题是 113383这个数超出int的表示范围了
#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将会出现在本书前言的致谢中。再次感谢您的宝贵意见!