湖南中醫藥大學OJ—1170到1179

Ge.t發表於2020-11-13

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;
}

相關文章