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的真假来跳出循环,依次判断运算符,将新输入变量加到原来的结果上