加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C语言100题相关解题思路(11-20题)

(2018-09-27 16:42:03)
分类: c程序相关
题目十一:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
该题的关键在于兔子的数量符合斐波那契数列-即第n位数等于n-1位和n-2位数相加。同样是通过相互赋值的方法改变相加数的位置。
例如1+1=2视为x+y=z,下一次计算应该为1+2=3,则相当于把y值当成新的x,把z看成新的y
即x+y=z
       x+y=z
相关代码
    printf("%d\n",y*2); //打印出第一位数,乘二是因为一对兔子为两只
    for(i=0;i<30;i++)
    {
        z=x+y;
        printf("%d\n",z*2); //注意先打印后赋值
        x=y;
        y=z;
    }

题目十二:判断101-200之间有多少个素数,并输出所有素数。
素数-指除了自身和1外,不能被其他数整除的数。主要是用两个for循环嵌套,首先循环查找的范围,然后循环查找的条件,查找条件比较简单,把被判断数从2除到201,每被整除就标记一次,不能被整除的就continue结束。除完之后查看标记的次数,根据素数的特性,凡是标记次数小于2的就输出概述,并另标记打印的次数(即说明找到了一个素数)。
相关代码
    int a=101,b,c,e=0;
    for(;a<201;a++)
    {
        c=0; //初始化整除标记为0;
        {
            if(a%b==0) //查找整除
                c++; //每整除一次就标记+1
            else
                continue; //不能被整除就结束循环
        }
        if(c<2) //当数只整除一次时进入
        {
            e++; //素数标记+1
            printf("%d\n",a);
        }
    }
    printf("e=%d\n",e); //素数标记打印要放在所有循环外面

题目十三:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数
例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方,问题重点在于如何拆解三位数为三个数。采用相减或除余的方法,然后用if函数检验即可。水仙花数共有四个,分别是153、370、371、407。
相关代码
相减方法
x=n/100;
y=(n/10)-(10*x);
z=n-(10*(10*x+y));
除余方法--最简
x=n/100;
y=n/10 % 10;
z=n % 10;

题目十四:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
思路应该为将数n从1开始除,每整除一个数就打印下来,直到最后除得1为止。
相关代码
    printf("number %d = ",n); //提前打印好
    for(i=2;i<10;i++) //i=1也可以,不过任何数除1也等于1,无意义
    {
        if(n % i==0) //整除时进入
        {
            if(n/i==1) //当除得1时是最后一个数,不用打*号
                printf("%d",i);
            else
                printf("%d * ",i);
            n=n/i; //整除后把剩下的数重新赋值
            i=2; //重置循环,缺这一步会导致只循环10次
            continue;
        }
    }

题目十五:利用条件运算符的嵌套来完成此题:输入一个学习成绩,大于等于90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
条件运算符的形式为 (条件表达式)?A:B; ,若表达式为真就输出A,否则输出B。验证则是从左到右,所以可以利用嵌套将B整体换成条件运算符。
相关代码
    a=(n>=90)?'A':((n<90&&n>=60)?'B':'C');//先验证是否大于90,再看是否区间内
    printf("%c\n",a);
注意:a为char型数据。

题目十六:输入两个正整数m和n,求其最大公约数和最小公倍数。
公倍数和公约数本质上都是一样的,所以只要查找两个数都能同时整除的数就行。再找出最大和最小即可。最大数可以不停赋值,最小则用if函数判断。
相关代码
    a=(m>n)?m:n; //用条件运算符找出大一点的数,for循环中循环到a即可
    for(i=2;i < a;i++)
    {
        if(m%i==0&&n%i==0)
        {
            max=i;
            if(min==0) //只把第一个值赋给公倍数
                min=i;
        }
    }
相也可以使用辗除法,即将m/n,若得0则循环结束,循环内得数不为0则将余数赋予n,将n值赋予m,然后继续除数
相关代码
    while(n!=0) //利用辗除法,直到b为0为止
    {
        temp=m%n;
        m=n;
        n=temp;
    }
    printf("Common factor:%d\n",m);
    printf("Common multiple:%d\n",num1*num2/m);

题目十七:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
问题核心是要将getchar()函数放入while循环的条件中去,这样子就能循环检查每个输入的字符,当字符等于回车的时候结束循环,这里使用scanf函数会显得比较复杂。
相关代码
    while((c=getchar())!='\n') //将getchar函数放入条件中,注意赋值符号括号
    {
        if(c>='A'&&c<='Z'||c>='a'&&c<='z')
            ch++;
        else if(c>='0'&&c<='9')
            nu++;
        else if(c==' ') //将空格直接放在分号之间即可
            bl++;
        else
            ot++;
    }

题目十八:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
共有5个数相加),几个数相加有键盘控制。即输入两个数,一个是a,一个是相加的次数。
主要是使用循环来重复相加,x代表初始数,y代表相加的次数,y=0则不相加,y=1就加一次,注意要声明一个临时变量来储存递增的数。
相关代码
    z=temp=x;
    for(i=0;i < y;i++)
    {
        if(y==0) //如果输入0不相加就直接退出循环以免不必要的计算
            break;
        else
        {
            temp=(temp*10)+x;
            z=z+temp;
        }
    }

题目十九:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
完数不包含两个相同因子相加的数,如4=2+2不是完数。主要解法与题目十四类似,都是依靠整除来查找因数,然后相加后对比。注意这道题需要重置的是相加的最终结果,不然初始数一直循环下去,相加结果会累加下去。
相关代码
    for(i=1;i < 1001;i++)
    {
        for(a=1;a < i;a++) //可不用计算1的因子
        {
            if(i%a==0)
                b=b+a;
        }
        if(i==b)
            printf("%d\n",i);
        b=0; //要重置相加结果
    }

题目二十:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
可将循环内设置成一次按当前高度落地,随后将高度的一半弹起,然后累加总路程,随后重新赋值高度。因为10次循环内有第10次的弹起高度,按题目要求,最后的总路程应减掉并另外表示。
相关代码
    float h=100.0,total=0.0,up,down; //高度可能计出带小数点的数,应用浮点型数据
    int i;
    for(i=0;i < 10;i++)
    {
        down=h;
        h=up=down/2; //弹起的高度同时赋值给当前高度
        total=total+(down+up);
    }
    printf("total=%f,the last up is %f\n",total-up,up); //总路程记得减掉最后的弹起

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有