郑轻OJ51~100题答案+详细解析

对于代码的疑问和改进欢迎交流和讨论,QQ:3153233088

后续注释会有的

这里介绍两种开平方根的方法,都需要用到头文件<math.h>

1.sqrt函数,专门开平方根的函数

2.pow函数,这是一个求任意次方的函数,可以用pow(n,0.5)来求n的平方根。

#include <stdio.h>
#include <math.h>
int main()
{
    int i,n;
    double sum=0,item;
    scanf("%lf %d",&item,&n);
    //下循环在求item的同时进行累加
    for(i=1;i<=n;i++)
    {
        sum=item+sum;
        item=sqrt(item);//把item定义为double就是防止开根后小数的损失
    }    
    printf("%.2lf",sum);
    return 0;
}

两种方法在于对各项的理解和求法

#include<stdio.h>
int main()
{
	int n,a,sum=0,x=0;//sum代表和,x为项的值
	scanf("%d%d",&n,&a);
	for(int i=1;i<=n;i++)
	{
		x=x*10+a;//从第二项开始,每一项就等于前一项乘以10再加a。第一项理解为0*10+a
		sum+=x;
	}
	printf("%d\n",sum);
	return 0;
}
#include <stdio.h>
#include <math.h>
int main()
{
	int i,n,a,x=0,sum=0;
	scanf("%d %d",&n,&a);
	for(i=1;i<=n;i++){
		x=x+a*pow(10,i-1);//从第二项开始,第i项a(i)=a(i-1)+a*10的(i-1)次方。第一项理解为0+a*10的0次方
		sum+=x;
	}
	printf("%d",sum);
	return 0;
}
#include <stdio.h>
int main()
{
    double x,fenzi,fenmu=1,sin=0;
    scanf("%lf",&x);
    fenzi=x;//第一项的值为X
    for(int i=1;i<=10;i++)
    {
		    sin+=fenzi/fenmu;//每次输出到第i项的和,然后下面为第(i+1)项的分子分母
		    //例如第一次进入循环,直接输出第一项的值,然后下面为第二项的分子和分母
		    fenzi=fenzi*x*x*(-1);//相邻两项的符号不同,且后一项的分子等于前一项乘以x的平方
		    fenmu=fenmu*(i*2)*(i*2+1);//第(i+1)项等于第i项乘以(2*i)*(2*i+)
    }
    printf("%.3lf",sin);
    return 0;
}

每天吃掉前一天剩余的一半加一个,第i天a(i)=a(i-1)/2-1。所以a(i-1)=(a(i)+1)*2;

那么从最后一天往前推第一天的桃子个数,只用循环这一过程

#include <stdio.h>
int main()
{
	int i,n;
	scanf("%d",&n);
	int all=1;//最后一天有1个桃子
	for(i=1;i<n;i++)
	{
	    all=(all+1)*2;//往前推前面一天的桃子数
	}
	printf("%d",all);
	return 0;
}

这个问题就是斐波那契数列,从第三项开始,每一项的值等于前两项的和,是一道经典的递推问题。

这里不采用定义函数来递推的方法,用更容易理解的方法

#include <stdio.h>
int main()
{
	int i,n,a=1,b=1,sum=0;
	scanf("%d",&n);
	//a表示一天之前的数量,b表示两天之前的数量
	if(n==1||n==2)
	{
	    sum=1;//前两天的数量均为1
	}
	for(i=3;i<=n;i++)
	{
	    sum=a+b;//让前两天的值相加得到这一天的值
	    b=a;//将一天之前的数量给b,更新了两天之前的数量
	    a=sum;//将这一天的数量给a,更新了一天之前的数量
	}
	printf("%d",sum);
	return 0;
}
#include <stdio.h>
int main()
{
	int m,n;
	scanf("%d %d",&m,&n);
	int i;
	int max=0;
	for(i=n;i>=m;i--)//由于需要输出最大的幸运数字,所以我们从最大数n开始遍历
	{
		if(i%7==0&&i%4!=0)//是7的倍数并且不是4的倍数
		{
			max=i;//将满足条件的数赋值给max
			break;//跳出循环
		}
	}
	if(max==0)//表示没有满足if条件的数
	{
		printf("no");
	}
	else
	{
		printf("%d",max);
	}
	return 0;
}
#include <stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	if(n==1)
	{
		n=4;//这里只要是一个不是质数的数都可以,使输入1时输出no
	}
	int i=2;
	while(i<n)
	{
		if(n%i==0)//只要有一个除去1和它自身之外的因数,它就不是质数
		{
			printf("No");
			break;//已经判断过了,直接跳出循环
		}
		else
			i++;//如果没有一个除去1和它自身之外的因数,i最终会等于n
	}
	if(i==n)
	{
		printf("Yes");
	}
    return 0;
}
#include <stdio.h>
int main()
{
    int n,m,j;
    scanf("%d",&n);
    double sum=0,ji=1;
    for(i=1;sum<n;i++)//该循环是求从1开始阶乘的和,直至阶乘的和大于所给的n,退出循环
	  {
        ji=ji*i;
        sum=sum+ji;
        m=i;
    }
	  m--;//由于上述循环退出时,对于此时的m,sum>n,故当m-1时,sum<n
    printf("m<=%d",m);
    return 0;
}
#include <stdio.h>
int main()
{
    int numb,max;
    scanf("%d",&numb);//输入第一个成绩
    max=numb;将第一个成绩给max,方便后续比较
    while(numb>=0){
        scanf("%d",&numb);
        if(numb>max){
            max=numb;//如果输入的成绩大于max,则将之赋值给max
        }
    }
	  printf("%d",max);
    return 0;
}
#include <stdio.h>
int main()
{
    int i,n;
    scanf("%d",&n);
    while(n>0)
    {
        i=n%10;//取出数字个位上的数
        n=n/10;//扔掉数字各个上的数字变成新的数字
        printf("%d ",i);//输出取得的数字个位上的数
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int i,n,m,j,h;
    scanf("%d",&n);
    m=n;
    for(i=0;m>0;i++)//循环求输入数的位数
	  {
        m=m/10;
    }
	  m=i;//将求得的位数给m
	  h=1;
    for(i=1;i<m;i++)
	  {
        h=h*10;
    }
    while(h>0)
	  {
        j=n/h;//取出数字最高位上的数,如12345/10000=1
        n=n%h;//扔掉数字最高位上的数字变成新的数字,如12345%100000=2345
        h=h/10;//h变为与n同位数的数,如10000/10=1000
        printf("%d ",j);输出取得的数字最高位上的数
    }
    return 0;
}

此题采用辗转相除法

辗转相除法,又称欧几里德算法,是求两个数的最大公约数的算法。具体做法是用较大的数除以较小的数,再用出现的余数去除除数,如此反复,直到最后余数为0为止,那么最后的除数就是这两个数的最大公约数。

#include <stdio.h>
int main()
{
    int m,n,i;
    scanf("%d %d",&m,&n);
    while(n!=0)
	  {
        //不用上来就考虑两个数的大小问题,例如:i=4%6(i=4);m=6;n=4;那么下一轮循坏就是i=6%4
        i=m%n;//求两个数的余数,
        m=n;//把除数放到被除数的位置
        n=i;//把得到的余数放到除数的位置
        //上三步实现了用较大的数除以较小的数,再用出现的余数去除除数,如此反复
    }
	  printf("%d",m);
    return 0;
}
#include <stdio.h>
int main()
{
    int m,n,t;
    scanf("%d %d",&m,&n);
    int m1=m,n1=n;
    while(n!=0)//求最大公约数:辗转相除法
	  {
        t=m%n;
        m=n;
        n=t;
    }qiuzui
	  int bei=m1/m*n1;//求最大公倍数:两个数的乘积除最大公约数(防止m1*n1的值超出int范围,故先除再乘)
    printf("%d %d",m,bei);
    return 0;
}
#include <stdio.h>
int main()
{
    char ch;
    while(ch=getchar(),ch!='@'){//输入字母,且字母不等于@
        if(ch>='A'&&ch<='Z'){//
            ch=ch+32;
        }//该if语句:如果是大写,将之变成小写
        if(ch>='a'&&ch<='y'){
            ch=ch+1;//该if语句:如果是小写,将之变成下一个
        }else if(ch=='z'){
            ch='a';//该if语句:若是'z',则转化为'a'
        }else ch=ch;
        putchar(ch);
    }
    return 0;
}
#include <stdio.h>
int main()
{
    char ch;
    int cnt=0;
    while(ch=getchar(),ch!='\n'){
        if(ch>='0'&&ch<='9'){
            cnt++;//如果字符是数字字符,cnt+1
        }
    }
    printf("%d",cnt);
    return 0;
}
#include <stdio.h>
int main()
{
    char ch;
    int numb1=0,numb2=0,numb3=0;
    while(ch=getchar(),ch!='\n'){
        if(ch>='0'&&ch<='9'){
            numb1++;//数字字符计数
        }else if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
            numb2++;//字母字符计数
        }
        else numb3++;//其他字符计数
    }
    printf("letter:%d\n",numb2);
    printf("digit:%d\n",numb1);
    printf("other:%d",numb3);
    return 0;
}
#include <stdio.h>
int main()
{
    int i,num,count=0;
    scanf("%d",&num);
    for(i=0;i<num;i++){
        if(i%10==4||i/10%10==4||i/100==4){
            count++;//统计含有4的数字的个数
        }
    }
    printf("%d",num-count);//用输入的里程数减去出现的含4的个数,就是真的里程数
    return 0;
}

题目的提示(1) 整数运算尽量避免pow之类的double类型函数,以免截断取整带来错误。 (2)可使用递推思想,充分利用中间结果。类似思想可参考秦九韶算法。秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法。计算一次多项式f(x) = a0*xn + a1*x(n-1) + … + an 只需要n次乘法和n次加法。原理是一次多项式f(x)可写成如下加括号方式:f(x) =(( (a0*x + a1)*x + a2) * x + … an-1) * x + an。自内向外去括号计算,只需要n次乘法和n次加法。
本题从高位到低位依次输出二进制数,对应多项式系数a0, a1,….,an, 而x的值为2。递推过程如下:
d = 0;
while( ch =  getchar(), ch != ‘\n’)
     d  = d * 2 + (ch – ‘0’);

#include <stdio.h>
int main()
{
    int ch;
    int sum=0;
    while(ch=getchar(),ch!='\n'){
       sum=sum*2+(ch-'0');
    }
    printf("%d",sum);
    return 0;
}
#include <stdio.h>
int main()
{
    int M,k;
    scanf("%d %d",&M,&k);
    int day=0;
    while(M--){
        day++;//每过1天,多花1元,
        if(day%k==0)//每花k元,再得一元
            M++;
    }
    printf("%d",day);
    return 0;
}

题目提示:可为四个方向编号,自向北开始,逆时针将4个方向依次编号为0,1,2,3。当接到向左转命令,方向号增1,向右转则方向号减1。为避免出现负数或大于3的情况,可对4取模。

#include <stdio.h>
int main()
{
    int time=0,command=0;
    int x=0,y=0;
    int direct=0;
    int time2=0;//上一次发出命令的时刻
    int diff=0;//时间差
    while(command!=3){//3表示停止,故不等于3
        scanf("%d",&time);//本次发出命令的时刻
        diff=time-time2;//计算时间差
        if(direct%4==0)//0表示北方
            y=y+10*diff;
        if(direct%4==1)//1表示东方
            x=x+10*diff;
        if(direct%4==2)//2表示南方
            y=y-10*diff;
        if(direct%4==3)//3表示西方
            x=x-10*diff;
        scanf("%d",&command);//输入指令
        if(command==1){//命令1,向左转
             if(direct==0)
                direct+=4;//该if语句是防止direct变成负数
            direct--//右转,direct-1;
            }
        if(command==2)direct++;//左转,direct+1
        time2=time;//这一轮结束,本次时间变成了上次的时间
    }
    printf("%d %d",x,y);
    return 0;
}
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=2;n>=i;i++){
        if(n%i==0){//如果i是n的质因子,输出i的值
            printf("%d ",i);
            n=n/i;//将n变为除以该质因子后的数字
            i=1;//初始化i的值
        }
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int high,up,down;
    scanf("%d %d %d",&high,&up,&down);
    int i;
    for(i=1;up*i-down*(i-1)<=high;i++){
            
    }
    printf("%d",i-1);
    return 0;
}
#include <stdio.h>
int main()
{
    int heads,feet;
    scanf("%d %d",&heads,&feet);
    int b=(feet-2*heads)/2;
    int a=heads-b;
    if(a+b!=heads||2*a+4*b!=feet||a<=0||b<=0)
        printf("No Answer");
    else 
        printf("%d %d",a,b);
    return 0;
}
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i=0,j=0;
    int k=n-i-j;
    int answer=0;
    for(i=0;i<=20;i++){
        for(j=0;j<33;j++){
            k=n-i-j;
            if(i*5+j*3+k/3==n&&k%3==0){
                printf("%4d%4d%4d\n",i,j,k);
                answer=1;
            }
        }
    }
    if(answer==0){
        printf("No Answer");
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int n,cost;
    scanf("%d %d",&n,&cost);
    int i=0,j=0;
    int k=n-i-j;
    int answer=0;
    for(i=0;i<=n;i++){
        for(j=0;j<=n;j++){
            k=n-i-j;
            if(i*3+j*2+k*1==cost&&k>=0){
            printf("%d% d% d\n",i,j,k);
            answer=1;
            }
        }
    }
    if(answer==0){
        printf("No answer");
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int x,y,z;
    int n;
    scanf("%d",&n);
    int answer=0;
    for(x=1;x<=9;x++){
        for(y=1;y<=9;y++){
            for(z=0;z<=9;z++){
                if(x*100+y*10+z+y*100+z*10+z==n){
                    printf("%4d%4d%4d",x,y,z);
                    answer=1;
                }
            }
        }
    }
    if(answer==0) printf("No Answer");
    return 0;
}
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i,j;
    for(i=0;i<n;i++)
    {
      for(j=1;j<=2*n-1;j++)
      {
        if(j==n-i||j==n+i)
            printf("*");
        else printf(" ");
      }
    printf("\n");
    }
    for(i=1;i<n;i++)
    {
        for(j=1;j<=2*n-1;j++)
        {
            if(j==i+1||j==2*n-(i+1))
                printf("*");
            else printf(" ");
        }
        printf("\n");
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i;
    for(i=1;i<=n;i++)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        printf("%d\n",a+b);
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF)
    printf("%d\n",a+b);
    return 0;
}
#include <stdio.h>
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b),a!=0||b!=0)
    printf("%d\n",a+b);
    return 0;
}
#include <stdio.h>
int main()
{
    int T,n;
    scanf("%d\n",&T);
    int i,k;
    int num,sum=0;
    for(i=1;i<=T;i++)
    { 
        scanf("%d",&n);
        for(k=1;k<=n;k++)
        {  
            scanf("%d",&num);
            sum=sum+num;
        }
    
    printf("%d\n",sum);
    sum=0;
    }
}
#include <stdio.h>
int main()
{
    int i,k,T;
    scanf("%d",&T);
    int num;
    int s;
    for(i=1;i<=T;i++)
    {   scanf("%d",&num);
        for(k=1;k<=num;k++)
        {      s=k;
            while(s>0)
            {
                if(s%10==7||k%7==0)
                {
                    printf("%d ",k);break;
                }
                s=s/10;
            }
        }
        printf("\n");
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int n;
    int zheng,fu,zero;
    double num;
    while(scanf("%d",&n),n!=0)
    {
        zheng=zero=fu=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%lf",&num);
            if(num<0) fu++;
            if(num==0) zero++;
            if(num>0) zheng++;
        }
        printf("%d %d %d\n",fu,zero,zheng);
    } return 0;
}
#include <stdio.h>
#include <math.h>
int main()
{
    double  x1,x2,y1,y2;
    double s;
    while(
    scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2)!=EOF)
    {
        s=sqrt(pow(x1-x2,2)+pow(y1-y2,2));
        printf("%.2lf\n",s);
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int n;
    int i,sum=1,num;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d",&num);
            if(num%2!=0)
            {
                sum*=num;
            }
        }
        printf("%d\n",sum);
        sum=1;
    }
    return 0;
}
#include <stdio.h>
int main()
{
    char a,b,c,t;
    while(scanf("%c%c%c",&a,&b,&c)!=EOF)
    {
        getchar();
        if(a>b)
        {
            t=a;
            a=b;
            b=t;
        }
        if(a>c)
        {
            t=a;
            a=c;
            c=t;
        }
        if(b>c)
        {
            t=b;
            b=c;
            c=t;
        }
        printf("%c %c %c\n",a,b,c);
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i,id;
    for(i=1;i<=n;i++)
    {
        int year,m,day;
        scanf("%*6d%4d%2d%2d%*4d",&year,&m,&day);
        printf("%4d-%02d-%02d\n",year,m,day);
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i;
    int num;
    for(i=1;i<=n;i++)
    {
        scanf("%*6d%5d",&num);
        printf("6%05d\n",num);
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i;
    double sum=1;
    for(i=1;i<=n;i++)
    {
        sum=sum*i;
        while(sum>=10)
        {
            sum=sum/10;
        }
    }
    printf("%d",(int)sum);
    return 0;
}
#include <stdio.h>
int main()
{
    int n;
    int num;
    int i;
    int a,b;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        num=1;
        scanf("%d %d",&a,&b);
        for(;b!=0;b--)
        {
            num=num*a;
            num=num%1000;
        }
        printf("%d\n",num);
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int n,a,b,c;
    int i;;
    while(scanf("%d",&n),n!=0)
    {
        if(n==1) printf("1\n");
        else if(n==2) printf("2\n");
        else 
        {
            a=1;b=2;
            for(i=3;i<=n;i++)
            {
                c=a+b;
                a=b;
                b=c;
            }
            printf("%d\n",c);
        }
    }
    return 0;
}
#include <stdio.h>
#include <math.h>
int prime (int n)
{
    int i=2;
    int result=1;
    for(i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            result=0;
        }
    }
    return result;
}
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    int i;
    for(i=m;i<=n;i++)
    {
        if(i==1) continue;
        if(prime(i)==1)
        {
            printf("%d ",i);
        }
    }
    return 0;
}
#include <stdio.h>
#include <math.h>
int prime (int n)
{
    int i=2;
    int result=1;
    for(i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            result=0;
        }
    }
    return result;
}
int main()
{
    int n;
    scanf("%d",&n);
    int i;
    for(i=1;i<=n/2;i++)
    {
        if(i==1) continue;
        if(prime(i)==1&&prime(n-i)==1)
        {
        printf("%d %d",i,n-i);
        printf("\n");
        }  
    }
    return 0;
}
int vowel(char ch)
{
    if(ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u'||ch=='A'||ch=='E'||ch=='I'||ch=='O'||ch=='U')
        return 1;
    else return 0;
}
int HmsToS(int h,int m,int s)
{
    s=3600*h+60*m+s;
    return s;
}
void PrintTime(int s)
{
    int h=0,m=0;
    h=s/3600;
    m=(s-3600*h)/60;
    s=s-h*3600-m*60;
    printf("%02d:%02d:%02d\n",h,m,s);

}
#include <stdio.h>
#include <math.h>
int narcissus(int n)
{
    int a,b,c;
    a=n/100;
    b=n/10%10;
    c=n%10;
    if(a*a*a+b*b*b+c*c*c==n)
    {
        return 1;
    }
    else return 0;
}
int main()
{
    int m,n;
    while(scanf("%d %d",&m,&n)!=EOF)
    {
        int cot=0;
        int i;
        for(i=m;i<=n;i++)
        {
            if(narcissus(i)==1)
            {
                if(cot==0)
                {
                    printf("%d",i);  
                    cot=1;
                }    else printf(" %d",i);
                
            }
        }   
        if(cot==0) printf("no");
        printf("\n");
    }
    return 0;
}
#include <stdio.h>
int getScore(char g)
{
    if(g=='A') return 95;
    else if(g=='B') return 85;
    else if(g=='C') return 75;
    else if(g=='D') return 65;
    else if(g=='E') return 40;
}
int main()
{
    char ch;
    double sum=0;
    int i=0;
    double count;
    while(scanf("%c",&ch),ch!='\n')
    {
        sum+=getScore(ch);
        i++;
        count=1.0*sum/i;
    }
    printf("%.1f\n",count);
    return 0;
}
double funF(double x)
{
    double result;
    if(x>3)
    result=2*(x-1);
    if(x<-1)
    result=2*(1-x);
    if(x<=3&&x>=-1)
    result=4;
 return result;
}
double funG(double x)
{
    double result;
    return result=x*x-3*x;
}
#include <stdio.h>
int main()
{
    int cot=0;
    int num;
    while(scanf("%d",&num)!=EOF)
    {
        cot=0;
        while(num!=1)
        {
            if(num%2==0)
            {
                num=num/2;
                cot+=1;
            }
            else
            {
                num=num*3+1;
                cot+=1;
            }
        }
        printf("%d\n",cot);
    }
    return 0;
}
#include <stdio.h>
int fact(int n)
{
    int i;
    int sum=1;
    for(i=1;i<=n;i++)
    {
        sum*=i;
    }
    return sum;
}
int main()
{
    int cot=0;
    int m,k;
    scanf("%d %d",&m,&k);
    cot=fact(m)/fact(m-k)/fact(k);
    printf("%d",cot);
    return 0;
}
------本文已结束,感谢您的阅读------
THE END
喜欢就支持一下吧
点赞18 分享
徐道陵的头像,网络安全爱好者中心-神域博客网
评论 共2条

请登录后发表评论