C语言100题相关解题思路(11-20题)
(2018-09-27 16:42:03)分类: c程序相关 |
题目十一:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
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;
}
int
a=101,b,c,e=0;
for(;a<201;a++)
{
c=0;
//初始化整除标记为0;
for(b=2;b < a+1
;b++) //不检验被1整除,从2到a+1即可,若到a则测不到被自身整除
{
if(a%b==0) //查找整除
c++;
//每整除一次就标记+1
else
continue;
//不能被整除就结束循环
}
if(c<2)
//当数只整除一次时进入
{
e++; //素数标记+1
printf("%d\n",a);
}
}
printf("e=%d\n",e); //素数标记打印要放在所有循环外面
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;
}
}
a=(n>=90)?'A':((n<90&&n>=60)?'B':'C');//先验证是否大于90,再看是否区间内
printf("%c\n",a);
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;
}
}
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);
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++;
}
z=temp=x;
for(i=0;i <
y;i++)
{
if(y==0)
//如果输入0不相加就直接退出循环以免不必要的计算
break;
else
{
temp=(temp*10)+x;
z=z+temp;
}
}
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; //要重置相加结果
}
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);
//总路程记得减掉最后的弹起
该题的关键在于兔子的数量符合斐波那契数列-即第n位数等于n-1位和n-2位数相加。同样是通过相互赋值的方法改变相加数的位置。
例如1+1=2视为x+y=z,下一次计算应该为1+2=3,则相当于把y值当成新的x,把z看成新的y
即x+y=z
相关代码
题目十二:判断101-200之间有多少个素数,并输出所有素数。
素数-指除了自身和1外,不能被其他数整除的数。主要是用两个for循环嵌套,首先循环查找的范围,然后循环查找的条件,查找条件比较简单,把被判断数从2除到201,每被整除就标记一次,不能被整除的就continue结束。除完之后查看标记的次数,根据素数的特性,凡是标记次数小于2的就输出概述,并另标记打印的次数(即说明找到了一个素数)。
相关代码
题目十三:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数
例如: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为止。
相关代码
题目十五:利用条件运算符的嵌套来完成此题:输入一个学习成绩,大于等于90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
条件运算符的形式为
(条件表达式)?A:B;
,若表达式为真就输出A,否则输出B。验证则是从左到右,所以可以利用嵌套将B整体换成条件运算符。
相关代码
注意:a为char型数据。
题目十六:输入两个正整数m和n,求其最大公约数和最小公倍数。
公倍数和公约数本质上都是一样的,所以只要查找两个数都能同时整除的数就行。再找出最大和最小即可。最大数可以不停赋值,最小则用if函数判断。
相关代码
相也可以使用辗除法,即将m/n,若得0则循环结束,循环内得数不为0则将余数赋予n,将n值赋予m,然后继续除数
相关代码
题目十七:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
问题核心是要将getchar()函数放入while循环的条件中去,这样子就能循环检查每个输入的字符,当字符等于回车的时候结束循环,这里使用scanf函数会显得比较复杂。
相关代码
题目十八:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时
共有5个数相加),几个数相加有键盘控制。即输入两个数,一个是a,一个是相加的次数。主要是使用循环来重复相加,x代表初始数,y代表相加的次数,y=0则不相加,y=1就加一次,注意要声明一个临时变量来储存递增的数。
相关代码
题目十九:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
完数不包含两个相同因子相加的数,如4=2+2不是完数。主要解法与题目十四类似,都是依靠整除来查找因数,然后相加后对比。注意这道题需要重置的是相加的最终结果,不然初始数一直循环下去,相加结果会累加下去。
相关代码
题目二十:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
可将循环内设置成一次按当前高度落地,随后将高度的一半弹起,然后累加总路程,随后重新赋值高度。因为10次循环内有第10次的弹起高度,按题目要求,最后的总路程应减掉并另外表示。
可将循环内设置成一次按当前高度落地,随后将高度的一半弹起,然后累加总路程,随后重新赋值高度。因为10次循环内有第10次的弹起高度,按题目要求,最后的总路程应减掉并另外表示。
相关代码