第五章(循环应用)习题
5-1、阶乘
1.while循环
#include <stdio.h>
int main()
{
int n;
int i=1;
int j=1;
scanf("%d",&n);
while(i <= n)
{
j *= i;
i++;
}
printf("%d!=%d\n",n,j);
return 0;
}
2.for循环
#include <stdio.h>
int main()
{
int n,i;
int j=1;
scanf("%d",&n);
for(i=1; i<=n; i++){
j *= i;
}
printf("%d!=%d\n",n,j);
return 0;
}
5-2、素数
1.判断素数
#include <stdio.h>
int main()
{
int x,i;
int label = 1;//表示X为素数
scanf("%d",&x);
for(i=2; i<x; i++)
{
if(x % i == 0)
{
label = 0;
break;//continue
}
}
if(label == 1)
{
printf("%d是素数",x);
}else{
printf("%d不是素数",x);
}
return 0;
}
2.输出100以内的素数
#include <stdio.h>
int main()
{
int x,i;
printf("100以内的素数:");
for(x=1; x<=100; x++)
{
int label = 1;//表示X为素数
for(i=2; i<x; i++)
{
if(x % i == 0)
{
label = 0;
break;//continue
}
}
if(label == 1)
{
printf("%d, ",x);
}
}
return 0;
}
3.输出前50个素数
#include <stdio.h>
int main()
{
int x,i;
int cnt=0; //累计素数个数
printf("前50个素数:\n");
for(x=1; cnt<50; x++)
{
int label = 1;//表示X为素数
for(i=2; i<x; i++)
{
if(x % i == 0)
{
label = 0;
break;//continue
}
}
if(label == 1)
{
cnt++;
printf("%d\t",x);//\t:水平制表符,使输出的每列对齐
if( cnt %5 == 0)//输出每行5个
{
printf("\n");
}
}
}
return 0;
}
5-3、凑硬币
question:
answer:
1.方法一:break跳出嵌套循环
#include <stdio.h>
int main()
{
int x,one,two,five;
int exit = 0;
scanf("%d",&x);
for(one=1; one<x*10; one++){
for(two=1; two<x*10/2; two++){
for(five=1; five<x*10/5; five++){
if(one + two*2 + five*5 == x*10){
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x);
exit = 1;
break;
}
}
if( exit ) break;//if(exit)等价于if(exit==1)
}
if( exit ) break;
}
return 0;
}
2.方法二:goto跳出嵌套循环
#include <stdio.h>
int main()
{
int x,one,two,five;
scanf("%d",&x);
for(one=1; one<x*10; one++){
for(two=1; two<x*10/2; two++){
for(five=1; five<x*10/5; five++){
if(one + two*2 + five*5 == x*10){
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x);
goto out;//!!!建议仅在多重循环中使用
}
}
}
}
out:
return 0;
}
5-4、前n项和
1.类型一:
question:
answer:
#include <stdio.h>
int main()
{
int i,n;
double sum = 0.0;
scanf("%d",&n);
for(i=1; i<=n; i++){
sum += 1.0/i;
}
printf("前%d项和为:%f\n",n,sum);
return 0;
}
2.类型二:
question:
answer:
#include <stdio.h>
int main()
{
int i,n;
double sum = 0.0;
double sign = 1.0;//既表示符号,又做分母
scanf("%d",&n);
for(i=1; i<=n; i++){
sum += sign/i;//注意分子和sum类型,int类型时‘/’运算符仅代表取整
sign = -sign;//每运算一次符号取反
}
printf("前%d项和为:%f\n",n,sum);
return 0;
}
5-5、正序分解整数
question:
answer:
#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
//计算输入的值的总位数
int mask = 1;//标记输入的值有几位数
int t = x;//临时存放输入值除以10的结果
while( t>9){
t /= 10;
mask *= 10;
}
printf("x=%d, mask=%d\n", x, mask);
//正序输出
do{
int d = x / mask;
printf("%d",d);
if(mask > 9){
printf(" ");
}
x %= mask;
mask /= 10;
}while( mask>0 );
printf("\n");
return 0;
}
5-6、求最大公约数
question:
answer:方法一(枚举法)
#include <stdio.h>
int main()
{
int a,b,min,i;
int ret = 0;
scanf("%d %d",&a,&b);
if(a < b){
min = a;
}else{
min = b;
}
for(i=1; i<min; i++){
if(a % i == 0){
if(b % i == 0){
ret = i;
}
}
}
printf("%d和%d的最大公约数是%d.\n",a,b,ret);
return 0;
}
answer:方法二(辗转相除法)
#include <stdio.h>
int main()
{
int a,b,t;
scanf("%d %d",&a,&b);
while(b != 0) {
t = a % b;
a = b;
b = t;
}
printf("最大公约数为:%d\n",a);
return 0;
}
5-7、求序列前N项和
question:
answer:
#include <stdio.h>
int main()
{
int i,n;
scanf("%d",&n);
double l = 2;//分子//int类型的长度不够
double m = 1;//分母
double sum=0.0;
double t;
for(i=0; i<n; i++) {
sum += l / m;
t = l;
l = l + m;
m = t;
}
printf("%.2f",sum);//精确到小数点后两位
return 0;
}
5-8、约分最简分式
question:
answer:
#include <stdio.h>
int main()
{
int l;//分子
int m;//分母
scanf("%d/%d",&l,&m);
int t;
int a = l;
int b = m;
//求最大公约数
while(b > 0){
t = a % b;
a = b;//最后一轮循环为最大公约数
b = t;
}
printf("%d/%d\n",l/a,m/a);
return 0;
}
5-9、念数字
question:
answer:
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
if(n < 0){
printf("fu ");
n = -n;
}
int mask = 1;
int t = n;
//确定输入数的基数;三位数的基数为100,四位数的基数为1000
while(t > 9){
t /= 10;
mask *= 10;//基数
}
do{
int d = n / mask;
switch(d){
case 0: printf("ling");break;
case 1: printf("yi");break;
case 2: printf("er");break;
case 3: printf("san");break;
case 4: printf("si");break;
case 5: printf("wu");break;
case 6: printf("liu");break;
case 7: printf("qi");break;
case 8: printf("ba");break;
case 9: printf("jiu");break;
}
if(mask > 9){//每次输出空格隔开,最后一位输出不加空格
printf(" ");
}
n %= mask;//取剩余位
mask /= 10;
}while(mask > 0);
printf("\n");
return 0;
}
5-10、求a的连续和
question:
answer:
#include <stdio.h>
int main()
{
int a,n,i;
scanf("%d %d",&a,&n);
int sum = 0;
int t = 0;
//0*10+2 2*10+2 22*10+2 前*10+2
for(i=0; i<n; i++){
t = t*10 + a;
sum += t;
}
printf("%d\n",sum);
return 0;
}