PTA-C语言课程作业--单循环结构(未完...)

PTA-C语言课程作业--单循环结构(未完...)

7-1 求交错序列前N项和 (15分)

本题要求编写程序,计算交错序列
1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。

输入格式:

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

输出格式:

在一行中输出部分和的值,结果保留三位小数。

输入样例:

5

输出样例:

0.917

#include <stdio.h>
int main(int argc, char *argv[]) {
	int n;
	int i;
	double sum;
	int sign = 1;
	scanf("%d",&n);
	for (i=1;i<=n;i++) {
		sum = sum + (double)sign*i/(2*i-1);
		sign = - sign;
	}
	printf("%.3f\n",sum);
	return 0;
	
}

题目理解起来很简单,关键是运算符号的正负交替,这里引入一个flag来对符号进行改变,每次循环运算符号都能改变。

7-3 正负数个数 (10分)

从读入的整数数据中,统计大于零的整数个数和小于零的整数个数。用输入零来结束输入,程序中用变量 i 统计大于零的整数个数,用变量 j 统计小于零的整数个数。

输入格式:

在一行中输入n(n<20)个用空格间隔的整数,最后输入0结束输入,数据之间只能用1个空格间隔。。

输出格式:。

在两行中分别按照“i=正数个数”和“j=负数个数”的格式输出结果,个数均原样输出,没有列宽控制。

输入样例:

-8 -9 2 5 -1 -4 0

输出样例:

i=2

j=4

#include "stdio.h"
int main()
{
	int n;
	int i=0,j=0;
	scanf("%d",&n);
	while (n!=0) {
		
		if(n>0)
		i++;
		if(n<0)
		j++;
		scanf("%d",&n);
	}
	printf("i=%d\n",i);
	printf("j=%d",j);
}

循环输入,并进行判断,这个题目很好理解,但要注意题目在循环中输入的位置。

7-4 特殊a串数列求和 (20分)

给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

输入格式:

输入在一行中给出不超过9的正整数a和n。

输出格式:

在一行中按照“s = 对应的和”的格式输出

输入样例:

2 3

输出样例:

s = 246

#include <stdio.h>

int main(int argc, char *argv[]) {
	
	int a = 0;
	int n =0;
	int s = 0;
	int sum ;
	int i =0;
	scanf("%d %d",&a,&n);
	if(a>9||a<0||n>9||n<0)
	{
		return  0;
	}
	for(i=1;i<=n;i++)
	{
		s = s*10+a;
		sum = sum+s;
	}
		printf("s = %d",sum);
		return 0;
}

这注意题目中算式的表达方式,当a=2,n=3,s = 2+22+222,在这里我刚开始犯了一个错误,看成了s = 2+22+22*2,题目本身是不难的,关键还是要理解题目。

7-5 最佳情侣身高差 (10分)

专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。

下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。

输入格式:

输入第一行给出正整数N(≤10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。

输出格式:

对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。

输入样例:

2

M 1.75

F 1.8

输出样例:

1.61

1.96

#include <stdio.h>  
int main () 
{  
	int n;  
	char c;  
	float h;  
	scanf("%d", &n);  
	getchar(); 
	while (n--) 
	{  
		scanf("%c %f", &c, &h);  
		getchar();  
		if (c == 'F' )   
			printf("%.2f\n", h * 1.09);  
		else  
			printf("%.2f\n", h / 1.09);  
	}   
	return 0;  
}

用一个while循环来对输入的用户数进行判断,进入循环,然后接收一个字符,数字,对所输入的进行判断,然后输出,主要要保留两个小数点。

7-6 满足3025=30+25和的平方的四位数 (10分)

一个四位数恰好等于它的前两位加后两位和的平方,编程找出所有满足要求的四位数。比如:3025=(30+25)*(30+25)。

输出格式:

在一行输出所有满足条件的数,每个数输出占5列。没有其它任何附加字符。

输出样例:

2025 3025 9801

#include <stdio.h>
#include "math.h"
int main(int argc, char *argv[]) {
	int i;
	int qian;
	int hou;
	int j=0;
	for(i=1000;i<=9999;i++,j++)
	{
		qian = i/100;
		hou = i%100;
		if(pow(qian+hou,2)==i)
		{
			printf("%5d",i);
		}
	}
}

这道题比较简单,进行一个1000-9999的循环,对循环到的数字进行判断,前两位数字/100获得,后两位%100获得,根据pow公式来计算是否与源数据相等,然后输出。

7-7 猜数字游戏 (15分)

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

输入格式:

输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。

输出格式:

在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

输入样例:

58 4

70

50

56

58

60

-2

输出样例:

Too big

Too small

Too small

Good Guess!

#include <stdio.h>
int main()
{
    int randnumber, n;
    int flag = 0;
    int i;
    int m;
    scanf("%d %d", &randnumber, &n);
    
    
    for (i = 1; i <= n; i++)
    {
        scanf("%d", &m);
        if (m < 0)
            break;
        if (m > randnumber)
            printf("Too big\n");
        if (m < randnumber)
            printf("Too small\n");
        if (m == randnumber)
        {
            if (i == 1)
            {
                flag = 1;
                printf("Bingo!\n");
                break;
            }
            if (i == 2 || i == 3)
            {
                flag = 1;
                printf("Lucky You!\n");
                break;
            }
            if (i > 3)
            {
                flag = 1;
                printf("Good Guess!\n");
                break;
            }
        }
    }
    if (flag == 0)
        printf("Game Over\n");
    return 0;
}

咋一看还以为是系统产生随机数,让你自己猜呢,原来是要你自己输入一个数和猜的字数,思路很简单,进行一个循环,输入数字来进行比较并给出相应的提示,猜正确的情况下,再对次数进行判断,最后输出结果。

7-8 念数字 (15分)

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling

1: yi

2: er

3: san

4: si

5: wu

6: liu

7: qi

8: ba

9: jiu

输入格式:

输入在一行中给出一个整数,如:1234。

提示:整数包括负数、零和正数。

输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。

输入样例:

-600

输出样例:

fu liu ling ling

#include<stdio.h>
int main()
{
	char x;
	x= getchar();
	while(x!='\n'){
    if(x=='-') printf("fu");
    else if(x=='0') printf("ling");
    else if(x=='1') printf("yi");
    else if(x=='2') printf("er");
    else if(x=='3') printf("san");
    else if(x=='4') printf("si");
    else if(x=='5') printf("wu");
    else if(x=='6') printf("liu");
    else if(x=='7') printf("qi");
    else if(x=='8') printf("ba");
    else if(x=='9') printf("jiu");
    x=getchar();
    if(x!='\n')
    printf(" ");
    }
}

循环输入,对输入的内容进行判断。假设输入 1 -1 3,此时没有输入回车,进入循环,判断1,然后进入-,此时还没有回车,进入循环,判断-,然后进入1,以此类推,最后进入3,判断完毕3以后,此时输入了回车,跳出循环。

7-10 jmu-c-二进制转10进制 (20分)(有误)

输入一组二进制字符,输出其对应的十进制数。当输入回车键时,输入结束。若输入非二进制字符,输出error input!

输入样例1:

11111111

输出样例1:

255

输入样例2:

34

输出样例2:

error input!

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[]) {
	
	long long n;
	int x;
	int sum = 0;
	scanf("%lld",&n);
	while(n!=0)
	{
		if(n%10<=1)
		{
			sum =sum + n%10*pow(2,x);
			n = n/10;
			x++;
		}
		if(n%10>=2)
		{
			printf("error input!");
			break;
		}
	}
	if(n==0)
	{
		printf("%d",sum);
	}
	return 0;
}

上面代码本身是没有问题的,只是不符合题目的要求,二进制变成十进制很好理解,二进制转为十进制要从右到左用二进制的每个数去乘以2的相应次方,小数点后则是从左往右。进行一个循环,循环内首先对输入的数进行判断,n%10得到所输入数字的最后一位数,此时x=0,pow为2的0次方,正好对应运算法则,然后n/10,得到除了最后一位数字的所有数字,x自增1,然后再进行判断。这里用1011为例,1011%10是<=1的,1011%10为0,1011/10为101,然后101%10为1,101/10为10,10%10=0,10/10=1....这样就很好理解了,这个题目我一开始想了用数组,数组倒叙,字符,字符串,无论用什么方式,能解决就好吧。

7-11 简单计算器 (20分)

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束

输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:

1+2*10-10/2=

输出样例:

10

#include<stdio.h>
int main()
{
	int a,b,c,flag=0;
	char ch;
	scanf("%d",&a);
	while((ch=getchar())!='=')
	{
		scanf("%d",&b);
		if((ch=='/')&&(b==0))
		{
			flag=1;break;
		}
		switch(ch)
		{
			case '+': a=a+b;break;
			case '-':a=a-b;break;
			case '*':a=a*b;break;
			case '/':a=a/b;break;
			default :
			flag=1;break;
		}
		if(flag) break;
	}
		if(flag)
		{
			printf("ERROR");
		}
	     else
	     {
	     	printf("%d",a);
		 }
	return 0;
}

注意,这个题目中所说每个运算符号的运算顺序都相同,等号”=”为判断循环结束的条件,利用flag的真假来跳出循环,依次判断运算符,将新输入变量加到原来的结果上