【C/PTA】循环结构进阶练习(三)

简介: 【C/PTA】循环结构进阶练习(三)

本文结合PTA专项练习带领读者掌握循环结构,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。


7-1 循环-Fibonacci数列的运算

小白龙最近学习了Fibonacci数列。它是这样定义的,F(1)=1; F(2)=1; F(n)=F(n-1)+F(n-2) (n>=3); 小白龙想改变一下,他把Fibonacci数列改为:

2/1, 3/2, 5/3…,F(n+2)/F(n+1)这种数列,现在给你一个数字n(2<n<=50),请你求出他前n项之和。

输入格式:

输入仅一个正整数n(2<=n<=50)。

输出格式:

输出为一个实数,保留小数点后六位,表示序列 2/1, 3/2, 5/3…,F(n+2)/F(n+1)的和。

输入样例:

在这里给出一组输入。例如:

7

输出样例:

在这里给出相应的输出。例如:

11.626099

#include <stdio.h>
int main()
{
  double a=2,b=1,t,s,sum=0;
  int n;
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
  {
    s=a/b;
    sum+=s;
    t=a;
    a=a+b;
    b=t;
  }
  printf("%.6f",sum);
}

7-2 循环-找数字

输入一行字符串,然后计算数字的个数。

输入格式:

输入一行字符串(不超过一百个字符)。

输出格式:

输出一个整数:数字的个数。

输入样例:

在这里给出一组输入。例如:

520firefirefire

输出样例:

在这里给出相应的输出。例如:

3

#include <stdio.h>
int main()
{
  char c;
  int count=0;
  while((c=getchar())!='\n')
  {
    if(c>='0'&&c<='9')
    {
      count++;
    }
  }
  printf("%d",count);
}

7-3 循环-小智的捕食计划

城市外有若干只荒神,小智当天捕食了一半,感觉收获有点少,又捕食了一只。第二天小智捕食了剩下的荒神的一半,又多捕食了一只。到了第n天,发现只剩下一只荒神。求第2天城市外有几只荒神?

输入格式:

输入仅一个整数n(2<=n<=30)。

输出格式:

输出一个整数:第2天城市外有几只荒神。

输入样例:

在这里给出一组输入。例如:

5

输出样例:

在这里给出相应的输出。例如:

22

#include <stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  int sum=1;
  for(int i=n-1;i>=2;i--)
  {
    sum=(sum+1)*2;
  }
  printf("%d",sum);
}

7-4 循环-抱大腿

新的一周里,老师给蒟蒻W新布置了n道题的作业,题目的编号1到n,第一道题的难度值为a,往后每道题的难度值比前一道题难度值多b。蒟蒻W有一个能力值c,他只能解决难度值小于等于c的题目。然而,这周的作业难度让W有点难顶,幸运的是,W同时认识hhd学长和orange学长,两位学长都太强了,没有什么题目是他们解决不掉的,然而为了让W能得到锻炼,hhd学长只会帮W解决题目编号为x的倍数且难度值大于c的题,orange学长只会帮W解决题目编号为y的倍数且难度值大于c的题目,现在蒟蒻W想知道两位学长共能帮他解决的题目的难度值之和是多少?

输入格式:

输入数据包含六个整数n,a,b,c,x,y

(0<=n<=1e5, 1<=a,b<=1e3,1<=c<=1e9,2<=x,y<=n,保证所有数据在int范围内)

输出格式:

输出两位学长能帮W解决的题目的难度值和

输入样例:

在这里给出一组输入。例如:

100 3 5 50 4 5

输出样例:

在这里给出相应的输出。例如:

10043

#include <stdio.h>
int main()
{
  long long int n,a,b,c,x,y;
  scanf("%lli%lli%lli%lli%lli%lli",&n,&a,&b,&c,&x,&y);
  long long int sum=0,mount=0,all=0;
  if(a>c)
  {
    all+=a;
  }
  for(long long int i=2;i<=n;i++)
  {
    a=a+b;
    if(i%x==0&&a>c)
    {
      sum+=a;
    }
    else if(i%y==0&&a>c)
    {
      mount+=a;
    }
  }
    all=sum+mount;
    printf("%lld",all);
}

7-5 循环-跳!

这是一个夏天的傍晚,hhd学长正在夕阳下愉快地在一条笔直跑道上跳跃,但由于hhd学长长期在实验室里训练,导致体力不足,已知hhd学长第一步可以跳a米,接下来的每一步都只能跳上一步的98%米,现在hhd学长想知道,如果要跳到至少距离起点x米的位置,他需要跳几步?

输入格式:

输入数据包含两个数a,x(2<=a<=5,0<=x<=100)。

a为整数,x不一定为整数。

输出格式:

输出数据仅有一个数,为对应步数。

输入样例:

在这里给出一组输入。例如:

2 4.3

输出样例:

在这里给出相应的输出。例如:

3

#include <stdio.h>
#include <math.h>
int main() {
    double a,x;
    scanf("%lf%lf",&a,&x);
    int n=0;
    double sum=0;
    while(sum<x)
    {
    sum+=a*pow(0.98,n);
    n++;
  }
  printf("%d",n);
  return 0;
}

7-6 循环-生气的峰峰

小峰峰上初中了,小峰峰除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习pascal、c和c++。但是小峰峰如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设小峰峰不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下小峰峰下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

输入格式:

输入包括 7 行数据,分别表示周一到周日的日程安排。每行包括两个小于 10的非负整数,用空格隔开,分别表示小峰峰在学校上课的时间和妈妈安排她上课的时间。

输出格式:

一个数字。如果不会不高兴则输出 0 ,如果会则输出最不高兴的是周几(用 1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。

输入样例:

在这里给出一组输入。例如:

5 3

6 2

7 2

5 3

5 4

0 4

0 6

输出样例:

在这里给出相应的输出。例如:

3

#include <stdio.h>
int main()
{
  int a[7],b[7];
  for(int i=0;i<7;i++)
  {
    scanf("%d %d",&a[i],&b[i]);
  }
  int flag=0;//判断不会不高兴
    for(int i=0;i<7;i++)
  {
    if(a[i]+b[i]>8)
    flag=1;
  } 
  if(flag==0)
  {
  printf("0");
  return 0;
  }
  //判断不高兴
  int maxday=-1;
  int maxhour=0;
  for(int i=0;i<7;i++)
  {
    int allhour=a[i]+b[i];
    if(allhour>maxhour)
    {
      maxday=i+1;
      maxhour=allhour;
    }
  }
  printf("%d",maxday);
  return 0;
}

7-7 循环-平方根

输入一个大于等于1000的正整数,计算输出它的平方根(如果平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为大于等于1000的正数,若不是,则重新读入。

输入格式:

输入若干个正整数,直到输入大于等于 1000 。保证输入数据中含有大于等于 1000 的正整数。

输出格式:

输出计算结果。

输入样例:

在这里给出一组输入。例如:

741

681

761

1066

输出样例:

在这里给出相应的输出。例如:

32

#include <stdio.h>
#include <math.h>
int main() {
    int n;
    do{
        scanf("%d",&n);
    }while(n<1000);
    int a=sqrt(n);
    printf("%d",a);
    return 0;
}

7-8 循环-得分

众所周知,在各大比赛规则中,选手得分通常由评委团给分中去掉一个最高分和一个最低分以后的平均值。现在,小C需要用电脑算分。于是他找来机智的你来为他写个程序。

输入格式:

输入第一行为一个整数N ( 2 < N <= 100 )。

接下来N行,没行有1个整数(a1 , … , aN) 表示评委团给出的分数。(0 < ai <= 100)

输出格式:

输出一个数表示最后得分。(保留到小数点后一位)

输入样例:

在这里给出一组输入。例如:

5

98

95

97

96

100

输出样例:

在这里给出相应的输出。例如:

97.0

7-9 循环-7的倍数

给出一个含有n个整数的序列,请输出这个序列中是7的倍数的数有几个。

输入格式:

第一行输入一个数 n(2 <= n <= 100),表示有 n 个整数。

第二行输入 n 个整数 ai (1 <= i <= n , 0 <= ai <= 100)。

输出格式:

输出序列中是7的倍数的数的个数。

输入样例:

在这里给出一组输入。例如:

13

36 50 13 42 88 87 66 32 28 73 94 52 11

输出样例:

在这里给出相应的输出。例如:

2

#include <stdio.h>
int main()
{
  int n,count=0;
  scanf("%d",&n);
  int a[n];
  for(int i=0;i<n;i++)
  {
    scanf("%d",&a[i]);
    if(a[i]%7==0)
    count++;
  }
  printf("%d",count);
}

7-10 循环-斯诺克

每逢周末,繁荣山丘的村民也会聚集在一起打斯诺克,据说冠军会奖励一台最先进的赛车喔~首先,先来介绍一下斯诺克的基本规则(熟悉的童鞋可以无视(~ ̄▽ ̄)~)

使用的球为1个白球,然后去击打15个红球和6个彩球(黄、绿、棕、蓝、粉、黑)。击球顺序为”一红、一彩”交替. 其中彩球落袋后要放回,直到红球全部落袋。 然后以黄、绿、棕、蓝、粉、黑的顺序逐个击球,最后以得分高者为胜.

分值: 红(1分)、黄(2分)、绿(3分)、棕(4分)、蓝(5分)、粉(6分)、黑(7分)

现在给出球桌上所剩球数balls,皮蛋目前得分score1,对手目前得分score2.请你判断,在最好情况下,皮蛋能否赢得这场球赛?(若出现平局,不算赢)

输入格式:

输入三个正整数balls, score1, score2, 含义如上所述。

输出格式:

若皮蛋能赢得球赛,输出"YES”,否则输出"NO”。

输入样例:

在这里给出一组输入。例如:

12 1 1

输出样例:

在这里给出相应的输出。例如:

YES

#include <stdio.h>
int score(int x)
{
    if(x==1)return 7;
    if(x==2)return 13;
    if(x==3)return 18;
    if(x==4)return 22;
    if(x==5)return 25;
    if(x==6)return 27;
    if(x==7)return 28;
    if(x>7)return 3+score(x-1);
}
int main(){
    int balls,score1,score2;
    scanf("%d%d%d",&balls,&score1,&score2);
    if(score(balls)+score1>score2)
        printf("YES");
    else
        printf("NO");
}

7-11 循环-桃子与猴子

猴子第一天摘了若干桃子,当天吃了一半,还不过瘾,又多吃了一个。第二天,又将剩下的桃子吃掉一半,又多吃了一个。到了第n天早上想再吃时,发现只剩下一个桃子了。求第一天猴子摘下了多少桃子。

输入格式:

输入仅一个整数n(1<=n<=30)。

输出格式:

输出一个整数:第一天摘了多少桃子。

输入样例:

在这里给出一组输入。例如:

5

输出样例:

在这里给出相应的输出。例如:

46

7-12 循环-好吃的苹果

小新买了一袋苹果,每个苹果都有一个val值,val值越高,这个苹果越美味。他想将val值最大的苹果留给小葵,把val值次大的苹果留给自己。你能帮他找出他想要的苹果吗?

输入格式:

输人第一行有一个整数 N (2 <= N <= 100) ,表示苹果个数。

接下来N行,每行一个不大于1000的正整数表示苹果的val值。(数据保证val值互不相同)。

输出格式:

输出最大和次大的val值,以一个空格隔开。

输入样例:

在这里给出一组输入。例如:

5

3

5

7

2

10

输出样例:

在这里给出相应的输出。例如:

10 7

#include <stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  int a[n];
  for(int i=0;i<n;i++)
  {
    scanf("%d",&a[i]);
  }
  int t;
  for(int i=0;i<n;i++)
  {
    for(int j=0;j<n-1-i;j++)
    {
      if(a[j]>a[j+1])
      {
      t=a[j];
      a[j]=a[j+1];
      a[j+1]=t;
      }
    }
  }
  printf("%d %d",a[n-1],a[n-2]);
}

7-13 循环-跳动的皮球

一个球从100米高度自由落下,每次落地后反弹到原高度一半,再落下,再反弹…求它第n次落地时,共下落了多少米,第n次反弹多高。

输入格式:

输入仅一个整数n(1<=n<=20)。

输出格式:

输出第n次落地前下落的总路程(不计算反弹的路程),及第n次反弹的高度,保留4位小数。

输入样例:

2

输出样例:

150.0000 25.0000

注:前100米不计入路程。

输入样例:

5

输出样例:

193.7500 3.1250

#include<stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  double a=100,h=100;
  double sum=100;
  for(int i=1;i<=n;i++)
  {
    h=h/2;//反弹的高度
  }
  if(n==1)
  sum=100;
  for(int i=2;i<=n;i++)
  {
    sum+=a/2;
    a/=2; 
  }
  printf("%.4f %.4f",sum,h);
}

7-14 循环-Lucky Number

皮蛋心爱的赛车零部件损坏严重T_T,于是皮蛋只好去求助维修达人小强,但是小强认为只有零部件损坏数量为Lucky Number才有可能修复好。若一个数的各位数字之和是素数,那么小强就认为它是Lucky Number。

请帮助可伶的皮蛋判断赛车能否修复好.

输入格式:

输入一个正整数n代表零部件损坏数量。

输出格式:

如果能修复好,请输出”Congratulations, Dao!”

反之则输出”So pity, Dao!”

输入样例:

在这里给出一组输入。例如:

7

输出样例:

在这里给出相应的输出。例如:

Congratulations, Dao!

#include <stdio.h>
#include <math.h>
int main(){
    long long int n,sum=0;
    scanf("%lli",&n);
    while(n!=0)
    {
        sum+=n%10;
        n/=10;
    }
    if(sum==0||sum==1)
    {
        printf("So pity, Dao!");
        return 0;
    }
    for(int i=2;i<=sqrt(sum);i++)
    {
        if(sum%i==0)
        {
            printf("So pity, Dao!");
            return 0;
        }
    }
    printf("Congratulations, Dao!");
    return 0;
}

7-15 循环-奇偶

给出一个含有 n 个数的数列,求在奇数序号位置的数的和与在偶数序号位置上的数的和的差。

如序列: 1 5 8 6 7 9 5 2 1 4

则答案为:(1+8+7+5+1)-(5+6+9+2+4)= -4

输入格式:

第一行输入一个数 n(1 <= n <= 100) 。

第二行输入 n 个数 ai(1 <= i <= n , 0 <= ai <= 100) 。

输出格式:

输出在奇数序号位置的数的和与在偶数序号位置上的数的和的差。

输入样例:

在这里给出一组输入。例如:

10

1 5 8 6 7 9 5 2 1 4

输出样例:

在这里给出相应的输出。例如:

-4

#include <stdio.h>
int main(){
  int n;
  scanf("%d",&n);
  int a[n],all=0,sum=0;
  for(int i=0;i<n;i++)
  {
    scanf("%d",&a[i]);
  }
  sum+=a[0];
  all+=a[1];
  for(int i=2;i<n;i++)
  {
    if(i%2==0)
    sum+=a[i];
    else
    all+=a[i];
  }
  printf("%d",sum-all);
}

7-16 循环-美丽的数

Alice是个爱美的人,而且她对美有独特的见解。就拿数字来说,两个整数中如果任意一个数的所有真约数(除去本身的约数)之和等于另外一个数,则她认为这组数是美的。现在要求你用C语言编写一段程序,判断任意给定的两个整数是否是美的,如果是输出YES,否则输出NO。

如:220的所有真约数之和为1+2+4+5+10+11+20+22+44+55+110=284,且284的所有真约数之和为1+2+4+71+142=220,所以这组数是美的。

输入格式:

输入数据的第一行包含一个整数N,接下有N行,每行包含两个整数a、b,以空格作为间隔,其中 0 <= a,b <= 600000。

输出格式:

输出有N行,每行为YES或NO。

输入样例:

在这里给出一组输入。例如:

2

220 284

110 200

输出样例:

在这里给出相应的输出。例如:

YES

NO

#include <stdio.h>
int hanshu(int n)
{
  int sum=0;
  for(int i=1;i<n;i++)
  {
    if(n%i==0)
    sum+=i;
  }
  return sum;
}
int main()
{
  int x;
  scanf("%d",&x);
  int a[x],b[x];
  for(int i=0;i<x;i++)
  {
    scanf("%d %d",&a[i],&b[i]);
  }
  for(int i=0;i<x;i++)
  {
    if(hanshu(a[i])==b[i]&&hanshu(b[i])==a[i])
    {
      printf("YES\n");
    }
    else
    printf("NO\n");
  }
}

7-17 循环-对峙

_RiverLoong和Anani_leaf在异世界里都是大土豪,而且都很谦虚,不愿意透露谁更有钱。笔者非常想知道他们俩谁更有钱,于是拜托你用编程计算出他俩的财富。

首先,_RiverLoong和Anani_leaf都会将自己的所有财产埋在一片属于自己的土地里,他们俩占据了一片没有边界的领地,然后在这片领地上划一条分界线,分界线以下为Anani_leaf的地盘,以上为_RiverLoong的地盘,在这片领地上建立一个笛卡尔二维坐标系,分界线为y=ax+b,现在笔者告诉你a,b,n的值,以及所有埋在地下的财产的坐标(x,y)与财产值p,请你计算出谁更有钱。

输入格式:

数据第一行给出三个整数n,a,b,然后接下来n行每行给出三个整数x,y,p。

输出格式:

如果_RiverLoong更有钱输出“_RiverLoong is richer.”;如果Anani_leaf更有钱输出“Anani_leaf is richer.”;如果两个人财产一样多输出“They are as rich as each other.”最后再分别输出_RiverLoong和Anani_leaf的总财富值。

输入样例:

在这里给出一组输入。例如:

2 1 0

1 3 2

2 -1 2

输出样例:

在这里给出相应的输出。例如:

They are as rich as each other.

2 2

#include <stdio.h>
int main()
{
  long long int n,a,b;
  scanf("%lli%lli%lli",&n,&a,&b);
  long long int x,y,p,sum=0,all=0;
  for(long long int i=0;i<n;i++)
  {
    scanf("%lli%lli%lli",&x,&y,&p);
    if(y>a*x+b)
    {
      sum+=p;
    }
    else if(y<a*x+b)
    {
      all+=p;
    }
  }
  if(sum>all)
  printf("_RiverLoong is richer.\n");
  else if(sum<all)
  printf("Anani_leaf is richer.\n");
  else
  {
  printf("They are as rich as each other.\n");
  }
  printf("%lld %lld",sum,all);
}

7-18 循环-求约数个数

求一个正整数n的约数个数。注意: int范围过小时,请用long long。

输入格式:

输入一行包括一个正整数n(1<=n<=10^12)。

输出格式:

输出仅有一个数,为n的约数个数。

输入样例:

在这里给出一组输入。例如:

2

输出样例:

在这里给出相应的输出。例如:

2

#include <stdio.h>
#include <math.h>
int main() {
    long long int n;
    scanf("%lli", &n);
    int count = 0;
    for (int i=1;i<=sqrt(n);i++)
  {//如果n的约数i不大于√n,那么n/i一定是n的约数
        if(n%i==0){
            count++;
            if(n/i!=i)
      {  // 如果n/i不等于i,说明i和n/i是一对不同的约数,count再加上1
                count++;
            }
        }
    }
    printf("%d",count);
    return 0;
}

7-19 循环-阶乘

给一个数 n,输出 n 的阶乘。

输入格式:

输入一个整数 n(1 <= n <= 12) 。

输出格式:

输出 n 的阶乘 n! 。

输入样例:

在这里给出一组输入。例如:

3

输出样例:

在这里给出相应的输出。例如:

6

#include <stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  int sum=1;
  for(int i=2;i<=n;i++)
  {
    sum*=i;
  }
  printf("%d",sum);
}

7-20 循环-斐波那契数列

比萨的列奥纳多,又称斐波那契,意大利数学家,西方第一个研究斐波那契数,并将现代书写数和乘数的位值表示法系统引入欧洲。

斐波那契在《算盘书》中提出了一个有趣的兔子问题:

  一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?

那么,第一个月,我们有1对兔子。第二个月,就有了2对兔子。依次类推,用F[i]来表示第i个月能繁殖多少兔子。于是:

F[0]=1,

F[1]=1,

F[2]=2,

F[3]=3,

F[n]=F[n-1]+F[n-2],

现在的问题是,给定n个数字ai,请你计算出F[ai]%1000007的值。

输入格式:

输入的第一行包括1个数字n(0<n<=1000),表示接下来有N个询问。

接下来,有N个数字a1~an(0<ai<400)

输出格式:

对于每次询问,先输出一行“ Case %d:”,再输出f[ai]%1000007的值.具体格式参照输出示例。

输入样例:

在这里给出一组输入。例如:

6

3

6

2

1

4

7

输出样例:

在这里给出相应的输出。例如:

Case 1:

3

Case 2:

13

Case 3:

2

Case 4:

1

Case 5:

5

Case 6:

21

#include <stdio.h>
int f(int x)
{
  int f1=1,f2=1;
  if(x==0||x==1)
  return 1;
  for(int i=2;i<=x;i++)
  {
    int t=(f1+f2)%1000007;
    f1=f2;
    f2=t;
  }
  return f2;
}
int main()
{
  int n;
  scanf("%d",&n);
  int x;
  for(int i=1;i<=n;i++)
  {
    scanf("%d",&x);
    printf("Case %d:\n%d\n",i,f(x));
  }
}

7-21 循环-水仙花数

一个三位数,当其各个位数字的立方和等于它本身时,它就是一个水仙花数。

小新希望你帮他找出两个数之间有多少个水仙花数。

输入格式:

输入仅一行,包括两个整数n 和m (100 <= n,m < 1000,m可能小于n)。

输出格式:

输出n 和 m 之间有多少个水仙花数(包括n 和 m 在内)。

输入样例:

在这里给出一组输入。例如:

300 380

输出样例:

在这里给出相应的输出。例如:

2

#include <stdio.h>
int main()
{
  int n,m;
  scanf("%d%d",&n,&m);
  if(n>m)
  {
    int t=m;
    m=n;
    n=t;
  }
  int count=0;
  for(int i=n;i<=m;i++)
  {
    int c=i%10;
    int b=i/10%10;
    int a=i/100;
      if(c*c*c+a*a*a+b*b*b==i)
      count++;
  }
  printf("%d",count);
}

7-22 循环-完美素数

对于质数P,如果存在两个正整数a,b使得P=a3-b3,则称P为完美素数。现在给你一个质数,你需要判断它是否为完美素数。

输入格式:

输入一个质数P ,2<=P<=10000000。

输出格式:

P如果为完美素数输出“YES”,否则输出“NO"。

输入样例:

在这里给出一组输入。例如:

7

输出样例:

在这里给出相应的输出。例如:

YES

#include <stdio.h>
int main()
{
  int p;
  scanf("%d",&p);
  for(int a=1;a<=1000;a++)
  {
    for(int b=1;b<=1000;b++)
    {
      if(p==a*a*a-b*b*b)
      {
        printf("YES");
        return 0;
      }
    }
  }
  printf("NO");
  return 0;
}

7-23 循环-完美数

各个真约数的和等于它本身的自然数叫做完全数(Perfect number),又称完美数或完备数。(列出某数的所有约数,去掉该数本身,剩下的就是它的真约数)

例如对于28的真约数为1、2、4、7、14,1+2+4+7+14=28

输入一个数字N,请输出该数字的真约数和,及该数字是否为完全数。

输入格式:

输入仅包含一个数字n(0<n<1000)。

输出格式:

输出数字n的真约数和,并输出n是否为完全数。是则输出“YES”,否则输出“NO”。

输入样例:

在这里给出一组输入。例如:

6

输出样例:

在这里给出相应的输出。例如:

6 YES

输入样例:

在这里给出一组输入。例如:

10

输出样例:

在这里给出相应的输出。例如:

8 NO

#include <stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  int sum=0;
  for(int i=1;i<n;i++)
  {
    if(n%i==0)
    sum+=i;
  }
  if(sum==n)
  printf("%d YES",sum);
  else
  printf("%d NO",sum);
}

7-24 循环-养兔子

假如,一对新生的兔子在两个月后有繁殖能力,即一对新生的兔子在第三个月及以后的每一个月都将生下一对小兔子。一位农夫在第一个月买了一对刚出生的兔子,请你帮忙算出第N个月,这位农夫将拥有多少对兔子。(假设兔子不会死。)

输入格式:

输入一个整数N ( 0 < N <= 40 )

输出格式:

输出一个整数表示第N个月农夫将拥有多少对兔子。

输入样例:

在这里给出一组输入。例如:

2

输出样例:

在这里给出相应的输出。例如:

1

输入样例:

在这里给出一组输入。例如:

3

输出样例:

在这里给出相应的输出。例如:

2

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a=1,b=1,sum=0;
    for(int i=3;i<=n;i++)
    {
        sum=a+b;
        a=b;
        b=sum;
    }
    printf("%d",sum);
    return 0;
}

7-25 循环-A的B次方

AB表示的是"A的B次方",即B个A相乘,VayH觉得如果数大一点的话,结果岂不是长得眼花缭乱吗?所以,他决定只要得到AB结果的最后四位数。

输入格式:

两个正整数A和B(1 <= A, B <= 10000),A和B之前用空格隔开

输出格式:

输出一行, 输出A^B的后四位,若不足四位,则补上前导零。

输入样例:

3 17

输出样例:

0163

#include<stdio.h>
int main()
{
  int a,b;
  scanf("%d %d",&a,&b);
  int x=1;
  for(int i=0;i<b;i++)
  {
    x=(x*a)%10000;
  }
  printf("%04d",x);
}

7-26 循环-frog

琪露诺很喜欢冻青蛙,她第一天冻一只,之后每天都比前一天多冻一只,现在问,她要过几天才会总计冻不少于n只青蛙?

输入格式:

输入一行包括一个正整数n(1<=n<=10^9)。

输出格式:

输出一行包括一个正整数,为冻超过n只青蛙至少需要的天数。

输入样例:

在这里给出一组输入。例如:

2

输出样例:

在这里给出相应的输出。例如:

2

#include <stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  int sum=0;
  for(int i=1;;i++)
  {
    sum+=i;
    if(sum>=n)
    {
      printf("%d",i);
      return 0;
    }
  }
}

7-27 循环-向前冲吧,皮蛋

最近,帅气的皮蛋每天都会驾驶着他心爱的尖峰 HT 驰骋在繁荣山丘的赛道上。已知皮蛋跑了 n 条赛道,第 i (1 <=i <=n) 条赛道长度为 di , 用时为 ti .(假设每条赛道只有 一圈).求皮蛋行驶的平均速度.

输入格式:

输入第 1 行为一个整数 n (1 <=n <=10000) .

接着n行,每 行 有 两 个 实 数 d 和 t 。

输出格式:

输出平均速度(保留到小数点后 3 位)。

输入样例:

在这里给出一组输入。例如:

3

1505 90

1230 45

2300 110

输出样例:

在这里给出相应的输出。例如:

20.551

#include<stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  double sum=0,all=0,a[n],b[n];
  for(int i=0;i<n;i++)
  {
    scanf("%lf %lf",&a[i],&b[i]);
    sum+=a[i];
    all+=b[i];
  }
  printf("%.3f",sum/all);
}

7-28 循环-捡馅饼

最近_RiverLoong在做题的空闲时间没事写了一个捡馅饼的游戏,游戏是这样的:在一条数轴上有一个永远饥饿的人RL,他会在数轴上不停地捡馅饼,每隔t+1秒时间天上会掉下来一个馅饼,并在地上停留持续t秒,t秒后会消失,RL每秒能走1米,他必须在它消失前捡到它并在捡到后站在该处等待下一个馅饼掉落,如果捡不到他就不会去走。由于RL不知道下一秒馅饼会落在哪,所以干脆每个他能捡到的馅饼他都会去捡。

一开始给出馅饼个数n,RL的位置pos和馅饼消失的时间值t,然后接下来n行每行给出1个数,代表每个馅饼在落在数轴上的位置,求最后他最后捡到的馅饼数和走过的总距离。

输入格式:

输入第一行给出三个整数n,p,time(所有整数绝对值小于100000),接下来n行每行给出一个整数pos。

输出格式:

输出最后捡到的馅饼数和他走过的总距离。

输入样例:

在这里给出一组输入。例如:

4 2 5

1

-1

0

7

输出样例:

在这里给出相应的输出。例如:

3 4

#include <stdio.h>
#include <math.h>
int main()
{
  long long int n,p,time,pos[20000]={0};
  scanf("%lli%lli%lli",&n,&p,&time);
  pos[0]=p;
  long long int count=0,sum=0;
  for(long long int i=1;i<=n;i++)
  {
    scanf("%lli",&pos[i]);
    if(abs(pos[i]-pos[i-1])<=time)
    {
      count++;
      sum+=abs(pos[i]-pos[i-1]);
    }
    else
    {
      pos[i]=pos[i-1];
    }
  }
  printf("%lld %lld",count,sum);
}

7-29 循环-max_and_min

输入n个数,请你找出次最大值和次最小值。

输入格式:

输入一行,第一个数为n(1<n<=100),表示数的个数,接下来有n个数,均为小于10^6的非负整数,每个之间用空格隔开,最后以换行结束。题目保证次最大值和次最小值存在。

输出格式:

输出次最大值和次最小值。

输入样例:

在这里给出一组输入。例如:

4 1 2 3 4

输出样例:

在这里给出相应的输出。例如:

3 2

#include <stdio.h>
int main()
{
  int max=0,secondmax=0;
  int min=10000,secondmin=10000;
  int n;
  scanf("%d",&n);
  int s;
  for(int i=0;i<n;i++)
  {
    scanf("%d",&s);
    if(s>max)
    {
    secondmax=max;
    max=s;  
    }
    else if(s<max&&s>secondmax)
    secondmax=s;
    if(s<min)
    {
    secondmin=min;
    min=s;
    }
    else if(s>min&&s<secondmin)
    secondmin=s;
  }
  printf("%d %d",secondmax,secondmin);
}

7-30 循环-Perfect Number

在繁荣山丘,存在着一种神奇的数,人们都称之为 Perfect Number。它是指在A进制下的各位数字之和 等于在B进制下的各位数字之和。比如说,2992的十进制表示的各位数字之和为 2+9+9+2 = 22, 它的十二进制表示为1894,各位数字之和为 1+8+9+4 = 22。So perfect!!!

请你根据输入的正整数,判断其是否为Perfect Number.

输入格式:

输入三个正整数n A B,进制A,进制B。

输出格式:

若该数为perfect number,请输出 “n is a perfect number.”

否则,输出 "n is not a perfect number.”

输入样例:

在这里给出一组输入。例如:

123 2 8

输出样例:

在这里给出相应的输出。例如:

123 is not a perfect number.

#include <stdio.h>
int hanshu(int n,int x)
{
  int sum=0;  
  while(n>0)
  {
    int t=n%x;
    sum+=t;
    n/=x;
  }
  return sum;
  }
int main()
{
  int n,a,b;
  scanf("%d%d%d",&n,&a,&b);
  int c=hanshu(n,a);
  int d=hanshu(n,b);
  if(c==d)
  printf("%d is a perfect number.",n);
  else
  printf("%d is not a perfect number.",n);
}

7-31 循环-平方根

利用迭代法计算x=sqrt(a)。

求平方根的迭代公式为:

xn+1=0.5*(xn+a/xn)。

输入格式:

输入仅一个实数a。

输出格式:

输出x,保留6位小数。

输入样例:

在这里给出一组输入。例如:

5.0

输出样例:

在这里给出相应的输出。例如:

2.236068

#include <stdio.h>
#include <math.h>
double hanshu(double a)
{
  double x0=a;
  double x1=0.5*(x0+a/x0);
  while(fabs(x1-x0)>=1e-6)
  {
    x0=x1;
    x1=0.5*(x0+a/x0);
  }
  return x1;
}
int main()
{
  double a;
  scanf("%lf",&a);
  double result=hanshu(a);
  printf("%.6f",result);
  return 0;
}

7-32 循环-sum

统计给定的n(n<10000)个数中,所有正数的和与负数的和。

输入格式:

第一行是一个n,n的范围已在题意中给出。

接下来一行输入n个整数。

输出格式:

输出两个数字,第一个为正数和,第二个为负数和,以空格隔开

如果没有正数或者负数则输出“no positive number 负数和”或“正数和 no negative number”,

如果正数负数都没有,则输出"no positive number no negative number"。

输入样例:

在这里给出一组输入。例如:

3

1 2 -1

输出样例:

在这里给出相应的输出。例如:

3 -1

#include <stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  int a;
  int sum=0,count=0,all=0,geshu=0;
  for(int i=0;i<n;i++)
  {
    scanf("%d",&a);
    if(a>0)
    {
      sum+=a;
      count++;
    }
    else if(a<0)
    {
      all+=a;
      geshu++;
    }
  }
  if(count==0&&geshu==0)
  {
    printf("no positive number no negative number");
  }
  else if(count==0&&geshu!=0)
  {
    printf("no positive number %d",all);
  }
  else if(count!=0&&geshu==0)
  {
    printf("%d no negative number",sum);
  }
  else
  {
    printf("%d %d",sum,all);
  }
}

7-33 循环-奇怪的斐波那契数列

在繁荣山丘,有一种奇怪的斐波那契数列,人们不关心他第几项是多少,只关心它能否被3整除。在这里,,F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2)。

请你判断一下第n项是否能被3整除?

输入格式:

输入一行,包括1个正整数n。

输出格式:

若F(n)能被3整除,则输出"YES",否则输出"NO"。

输入样例:

在这里给出一组输入。例如:

5

输出样例:

在这里给出相应的输出。例如:

NO

#include <stdio.h>
int main() 
{
    int a[8] = {1, 2, 0, 2, 2, 1, 0, 1};
    int n;
    scanf("%d", &n);
        if (a[n % 8] == 0) {
            printf("YES");
        } else {
            printf("NO");
        }
    return 0;
}

7-34 循环-字符统计

输入一行字符,请分别统计出其中英文字母、空格、数字和其他字符的个数。

输入格式:

输入仅包含一行字符串,包含空格。字符串长度小于100。

输出格式:

输出包括4个数字,分别表示英文字母、空格、数字和其他字符的个数,以空格隔开。

输入样例:

在这里给出一组输入。例如:

You have 7 new messages!

输出样例:

在这里给出相应的输出。例如:

18 4 1 1

#include <stdio.h>
int main() {
    int letterCount=0,spaceCount=0,digitCount=0,otherCount=0;
    char c;
    while((c=getchar())!='\n'){
        if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){
            letterCount++;
        }
        else if(c==' '){
            spaceCount++;
        }
        else if(c>='0'&&c<='9'){
            digitCount++;
        } 
        else{
            otherCount++;
        }
    }
    printf("%d %d %d %d",letterCount,spaceCount,digitCount,otherCount);
    return 0;
}

7-35 沙漏

给一个正整数 n,表示一个高度为 2 * n - 1 的沙漏,请打印出这个沙漏。

输入格式:

输入一个正整数 n (1 <= n <= 20)。

输出格式:

输出一个高度为 2 * n - 1 的沙漏(每行末尾换行无空格,不要输出多余空格)。

输入样例:

在这里给出一组输入。例如:

3

输出样例:

在这里给出相应的输出。例如:

#####
 ###
  #
 ###
#####
#include <stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<i;j++)
    {
      printf(" ");
    }
    for(int j=i;j<=n;j++)
    {
      printf("#");
    }
    for(int j=n-1;j>=i;j--)
    {
      printf("#");
    }
    printf("\n");
  }
  for(int i=n-1;i>=1;i--)
  {
    for(int j=1;j<i;j++)
    {
      printf(" ");
    }
    for(int j=i;j<=n;j++)
    {
      printf("#");
    }
    for(int j=n-1;j>=i;j--)
    {
      printf("#");
    }
    printf("\n");
  }
}

7-36 求简单交错序列前N项和

本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + … 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后三位。题目保证计算结果不超过双精度范围。

输入样例:

10

输出样例:

sum = 0.819

#include<stdio.h>
int main()
{
  double a=1,b=1,sum=1;
  int n;
  scanf("%d",&n);
  for(int j=2;j<=n;j++)
  {
    a=-a;
    b+=3;
    sum+=a/b; 
  }
    printf("sum = %.3f",sum);
}

7-37 21循环-求和2

sxtc爱做数学题,今天他又拿到一道数学题:给定n,求出

他希望擅长求和的你帮他解出这个求和问题。

输入格式:

读入一个数n。

输出格式:

输出求和结果。

输入样例:

在这里给出一组输入。例如:

114

输出样例:

在这里给出相应的输出。例如:

240

#include <stdio.h>
#include <math.h>
int main()
{
  long long int n;
  scanf("%lli",&n);
  long long int sum=0;
  for(int i=1;i<=sqrt(n);i++)
  {
    if(n%i==0)
    {
    sum+=i;
      if(n/i!=i)
      {
      sum+=n/i;
      }   
    }
  }
  printf("%lli\n",sum);
}

7-38 个位数

最近zyz大佬喜欢上了个位数,所以他讨厌除了个位数之外的所有数,于是他看到一个大于9的数,便用其数位之和去代替这个数,如果位数仍然大于9,则继续重复上述步骤,直到其小于10为止。

例如:13421 -> 1+3+4+2+1 = 11 -> 1+1 = 2

输入格式:

一个非负整数(int范围内)。

输出格式:

经过变换后的答案。

输入样例:

在这里给出一组输入。例如:

19260817

输出样例:

在这里给出相应的输出。例如:

7

#include <stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  while(n>=10)//使得到的数小于10为止
  {
    int sum=0;
    while(n>0)//位数相加
    {
      sum+=n%10;
      n/=10;
    }
    n=sum;
  }
  printf("%d",n);
}

7-39 循环-分数矩阵

我们定义如下矩阵:

1/1  1/2  1/3
1/2  1/1  1/2
1/3  1/2  1/1

矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增。

请求出这个矩阵所有元素的和。

输入格式:

每行给定整数N (N<50000),表示矩阵为 N*N。当N为0时,输入结束。

输出格式:

输出答案,保留2位小数。

输入样例:

在这里给出一组输入。例如:

1

2

3

4

0

输出样例:

在这里给出相应的输出。例如:

1.00

3.00

5.67

8.83

//通过观察可以发现结果为n个1 + (n-1)*2个1/2 + (n-2)*2个1/3 + (n-3)*2个1/4 + ... + 2个1/n
//可以看出,每一项的系数都是(n-i),其中i的取值范围是从1到n
//而每一项的分母为(i+1),因此我们可以使用循环结构来逐项相加。
#include <stdio.h>
double a(int n)
{
  double sum=0;
  for(int i=1;i<=n;i++) 
  {
  sum+=(n-i)*2.0/(i+1);
  }
  sum+=n;
  return sum;
}
int main() {
    int n;
    double t;
  while(1)
    {
  scanf("%d",&n);
  if(n==0)
  {
    break;
  }
  t=a(n);
  printf("%.2f\n",t);
  }
}


目录
相关文章
|
2月前
|
程序员 C语言
C语言程序设计——循环语句
C语言程序设计——循环语句
|
2月前
|
机器学习/深度学习 C语言
【C/PTA】循环结构专项练习(选择+填空)
【C/PTA】循环结构专项练习(选择+填空)
142 0
|
2月前
【C/PTA】循环结构进阶练习(二)
【C/PTA】循环结构进阶练习(二)
35 0
|
2月前
|
机器学习/深度学习
【C/PTA】循环结构进阶练习(一)
【C/PTA】循环结构进阶练习(一)
41 0
|
2月前
【C/PTA】选择结构进阶练习
【C/PTA】选择结构进阶练习
37 0
|
2月前
|
人工智能
【C/PTA】循环结构专项练习(编程)
【C/PTA】循环结构专项练习(编程)
54 0
|
2月前
|
机器学习/深度学习 人工智能 C语言
【C/PTA】循环结构进阶练习(三)
【C/PTA】循环结构进阶练习(三)
60 0
|
2月前
|
测试技术 数据安全/隐私保护
【C/PTA】数组进阶练习(二)
【C/PTA】数组进阶练习(二)
43 0
|
2月前
|
机器学习/深度学习 人工智能
【C/PTA】数组进阶练习(三)
【C/PTA】数组进阶练习(三)
110 0
|
2月前
|
机器学习/深度学习
【C/PTA】数组进阶练习(一)
【C/PTA】数组进阶练习(一)
29 0