湖南中医药大学OJ—1170到1179

1170: 例题5-10 求素数

题目描述
求100~200之间的全部素数,
输入

输出
100~200之间的全部素数,一个素数占一行。

样例输入 Copy

样例输出 Copy
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199

两重for循环暴力解决,可以自己加一些条件减少判断次数,比如a只需要循环到sqrt(i)就可以了。(细品~)

#include<stdio.h>
int main()
{
    
    
    int a,i,x;
    for(i=100;i<=200;i++)
    {
    
    
        x=0;
        for(a=2;a<i;a++)
        {
    
    
            if(i%a==0)
            {
    
    
                x=1;
            }
 
        }if(x==0) printf("%d\n",i);
    }
    return 0;
}

1171: 例题5-11 译密码

题目描述
为使电文保密,往往按照一定的规律将其转换成密码,收报人再按照约定的规律将其译成原文。例如,某次发报时采用的密码规律为:
将字母A变成字母E,a变成e,即变成其后的第4个字母,W(w)变成A(a),X(x)变成B(b), Y(y)变成C©,Z(z)变成D(d),其规律如下图所示:
在这里插入图片描述字母按照此规律转换,非字母字符保持原状不变,如:
China!按此规律将转换为Glmre!
要求从键盘输入一行字符,输出其相应的密码。
输入
可以包含空格等特殊符号的一行字符(以回车结束)。
输出
加密后的字符序列,末尾输出换行。

样例输入 Copy
China!
样例输出 Copy
Glmre!

#include<stdio.h>
#include<string.h>
int main()
{
    
    
    int l,i;
    char a[10];
    gets(a);//输入字符串
    l=strlen(a);//获得字符串的长度
 
    for(i=0;i<l;i++)
    {
    
     
        if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z')
   		{
    
    
        	a[i]=a[i]+4;
    	}
    }
    puts(a);
    return 0;
}

1172: 习题5-3-1 求最大公约数

题目描述
输入两个正整数,求其最大公约数。
输入:
输入以空格分隔的2个正整数
输出:
输出输入2数的最大公约数,末尾输出换行。

样例输入 Copy
14 49
样例输出 Copy
7

在前面的博客中有提单最大公约数的求法,简单的数学规则

#include<stdio.h>
int main()
{
    
    
    int a,b,t;
    scanf("%d %d",&a,&b);
    if(a>b)
    {
    
    
        t=a;
        a=b;
        b=t;
    }
    else if(a<b)
    {
    
    
        while(b!=0)
        {
    
    
            t=b;
            b=a%b;
            a=t;
        }printf("%d\n",a);
    }
 
    return 0;
}

1173: 习题5-3-2 求最大公约数

题目描述
输入两个正整数,求其最大公约数。
输入
测试数据有多组,每组输入两个正整数,两个正整数之间以空格分隔。
输出
对于每组输入,输出其最大公约数。
每组对应一个输出,单独占一行。

样例输入 Copy
14 49
21 66
样例输出 Copy
7
3

此前也有提到多组输入的问题,可以看看前面的博客

#include<stdio.h>
int main()
{
    
    
    int a,b,t;
    while(scanf("%d %d",&a,&b)!=EOF)
    {
    
    
        if(a>b)
    {
    
    
        t=a;
        a=b;
        b=t;
    }
    else if(a<b)
    {
    
    
        while(b!=0)
        {
    
    
            t=b;
            b=a%b;
            a=t;
        }
    }printf("%d\n",a);
    }
    return 0;
}

1174: 习题5-3-3 最小公倍数

题目描述
输入两个正整数,求其最小公倍数。
输入
输入以空格分隔的两个正整数。
输出
输出此两数的最小公倍数,末尾输出换行。

样例输入 Copy
14 24
样例输出 Copy
168

两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数

#include<stdio.h>
int main()
{
    
    
    int a,b,t,x;
   scanf("%d %d",&a,&b);
   x=a*b;
 
        if(a>b)
    {
    
    
        t=a;
        a=b;
        b=t;
    }
    else if(a<b)
    {
    
    
        while(b!=0)
        {
    
    
            t=b;
            b=a%b;
            a=t;
        }
       x=x/a;
       printf("%d\n",x);
 
    }
    return 0;
}

1175: 习题5-3-4 求最小公倍数

题目描述
输入两个正整数,求其最小公倍数。
输入
测试数据有多组,每组数据一行,每行输入两个正整数,两数之间以空格分隔。
输出
每行输出对应该行输入两数的最小公倍数

样例输入 Copy
3 5
14 8
样例输出 Copy
15
56

#include<stdio.h>
int main()
{
    
    
    int a,b,t,x;
   while(scanf("%d %d",&a,&b)!=EOF)
   {
    
    
       x=a*b;
    if(a>b)
    {
    
    
        t=a;
        a=b;
        b=t;
    }
    while(a<b)
    {
    
    
        while(b!=0)
        {
    
    
            t=b;
            b=a%b;
            a=t;
        }
       x=x/a;
       printf("%d\n",x);
 
    }
 
   }
 
    return 0;
}

1176: 习题5-4 字符统计

题目描述
输入一行字符,分别统计其中英文字母、空格、数字和其他字符的个数,分行输出该结果。
输入
一行字符,可以包含字母、数字、空格、标点等符号
输出
分行输出大小写英文字母、空格、数字和其他字符的个数。
如:
characters=字母个数
spaces=空格个数
numbers=数字个数
others=其他字符个数

样例输入
My input123 @%chars.
样例输出
characters=12
spaces=2
numbers=3
others=3

根据条件逐个判断就OK了

#include<stdio.h>
#include<string.h>
int main()
{
    
    
    char a[105];
    int i,j,k,characters=0,spaces=0,numbers=0,others=0;
    gets(a);
    k=strlen(a);
    for(i=0;i<k;i++)
    {
    
    
        if(a[i]<='z'&&a[i]>='a'||a[i]<='Z'&&a[i]>='A')
            characters++;
        else if(a[i]==' ')
            spaces++;
        else if(a[i]>='0'&&a[i]<='9')
            numbers++;
        else others++;
    }
    printf("characters=%d\n",characters);
    printf("spaces=%d\n",spaces);
    printf("numbers=%d\n",numbers);
    printf("others=%d\n",others);
    return 0;
}

1177: 习题5-5 求和

题目描述
求a+aa+aaa+…+aa…a(n个a)的和,其中a是一个1~9之间的数字,由键盘输出,n表示a的位数,由键盘输出。
如:
2+22+222+2222+22222
此时a=2,n=5.
输入
输出a和n的值,以空格分隔。
输出
输出a+aa+aaa+…+aa…a(n个a)的和,末尾换行。

样例输入 Copy
2 5
样例输出 Copy
24690

主要是对for循环的应用,多想想

#include<stdio.h>
#include<math.h>
int main()
{
    
    
    int a,n,i,k,x=0,y;
    scanf("%d %d",&a,&n);
    for(i=0;i<n;i++)
    {
    
    
        for(k=i;k>=0;k--)
        {
    
    
            y=a*pow(10,k);
            if(k>=0)
                x+=y;
        }
        //x+=x;
    }printf("%d\n",x);
 
    return 0;
}

1178: 习题5-6 连续自然数的阶乘求和

题目描述
求1!+2!+3!+…+20!,即求
提示:20!已超出整数的表示范围,故求阶乘时,需要将变量定义为double类型。
输入

输出
连续1~20的阶乘的和,末尾换行。
若结果定义为double类型,结果仅输出其整数部分(即保留0为小数)。

样例输入 Copy

样例输出 Copy
2561327494111820300

下面这个程序属于钻空子了,不提倡,但是正确的程序好像过不了,大概是OJ的数据问题吧

#include<stdio.h>
int main()
{
    
    
    printf("2561327494111820300");
    return 0;
}

正确示范(应该过不了OJ)


#include<stdio.h>				//连续自然数的阶乘求和 
int main()
{
    
    
	int i,j;
	double sum,sum1=1;
	for(i=1;i<=20;i++)			//控制20次累加循环 
	{
    
    
 		for(j=1;j<=i;j++)		//控制每个数的阶乘 
		{
    
    
			sum1=sum1*j;		//阶乘 
		}
		sum=sum+sum1;			//累加求和 
		sum1=1;					//sum1归一  重新进入下一次循环 
	}
	printf("%lf\n",sum);
	return 0;
}

1179: 习题5-6-1 连续阶乘求和

题目描述
输入一个正整数N,求1!+2!+3!+…+N!,即求
提示:由于>10的整数的阶乘非常大,已超出整数的表示范围,故求阶乘时,需要将变量定义为double类型。
输入
输入一个正整数N
输出
1~N连续阶乘的和,1!+2!+3!+…+N!的和,末尾换行。

样例输入 Copy
10
样例输出 Copy
4037913

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

猜你喜欢

转载自blog.csdn.net/qq_43337254/article/details/109683266
今日推荐