1067: 有问题的里程表
题目描述
某辆汽车有一个里程表,该里程表可以显示一个整数,为该车走过的公里数。然而这个里程表有个毛病:它总是从3变到5,而跳过数字4,里程表所有位(个位、 十位、百位等)上的数字都是如此。例如,如果里程表显示339,汽车走过1公里之后,该里程表显示350。
输入
输入一个整数num,表示里程表显示的数值,1 < num < 1000,且一定不含整数4。
输出
输出一个整数,为该汽车实际行驶的公里数。例如,如果该里程表显示55,则实际走过的公里 数是40。
样例输入
106
样例输出
86
提示
方法1:这对本题数据规模较小的情况,可用一个循环来模拟。用一个1~num的循环,在循环过程中,用另一个循环变量计数,统计不含数字4的整数个数。
方法2:此题稍加修改,可转换为一个9进制转换为10进制的问题,此方法更通用。
#include <stdio.h>
int main()
{
int num,i,n=0;
scanf("%d",&num);
for(i=1;i<=num;i++){
if(i%10==4 || i/10%10==4 || i/100==4)
n++;
}
printf("%d",num-n);
return 0;
}
统计含有4的里程个数,再用里程表显示的数减去含4的个数。
比如,num=5,实际应该显示4。
1 2 3 5 6 7 8 9 10 11 12 13 15 … 23 25 … 33 35 36 37 38 39 50 51 52 53 55 …
1068: 二进制数
题目描述
将一个二进制数,转换为对应的十进制数。
输入
输入一个只含有’0’和’1’的字符串,以回车结束,表示一个二进制数。该二进制数无符号位,长度不超过31。
输出
输出一个整数,为该二进制数对应的十进制数。
样例输入
100000000001
样例输出
2049
提示
(1) 整数运算尽量避免pow之类的double类型函数,以免截断取整带来错误。 (2)可使用递推思想,充分利用中间结果。类似思想可参考秦九韶算法。秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法。计算一次多项式f(x) = a0xn + a1x(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()
{
char ch;
int d=0;
while(scanf("%c",&ch),ch!='\n'){
d=d*2+ch-'0';
}
printf("%d",d);
return 0;
1069: 向Z同学学习
题目描述
Z同学为了实现暑假去云南旅游的梦想,决定以后每天只消费1元,每花k元就可以再得到1元,一开始Z同学有M元,问最多可以坚持多少天。
输入
输入2个整数M, k,(2 <= k <= M <= 1000)。
输出
输出一个整数,表示M元可以消费的天数。
样例输入
4 3
样例输出
5
#include <stdio.h>
int main()
{
int M,k,i=0,n=0; //0<=i<=k,n记录总天数
scanf("%d %d",&M,&k);
while(M>0){
i++;
n++;
M--;
if(i==k){
M++;
i=0;
}
}
printf("%d",n);
return 0;
}
1070: 小汽车的位置
题目描述
有一辆智能小车,最初(时间为0)的位置为(0,0),我们想知道它最后的位置。小车以每小时10公里的速度向北移动(以北为y轴正向,以东为x轴正向)。小车会受到一系列依照时间戳记排序的命令,1表示“向左转”,2表示“向右转”,3表“停止”。每个命令的前面有一个时间戳记,所以我们知道该命令是何时发出的。最后一个命令一定是“停止”。我们另外假设,这辆小车非常灵活,它可以在瞬间转弯。
以下列输入为例。小车在时间为5的时候收到一个“向左转”的命令1,在时间10收到一个“向右转”的命令2,在时间15收到一个“停止”的命令3。那么在最后时间15的时候,小车的位置将在(-50,100)。程序只要求输出小车最后的位置,第一个整数是x坐标,第二个整数是y坐标。
输入
输入包含多个命令,每个命令由整数time和command组成,表示在时刻time发出命令command。command的取值范围1-3,含义如上所述。
输出
输出占一行,包含两个整数,表示小车的最终位置。两个整数之间由空格隔开。
样例输入
5
1
10
2
15
3
样例输出
-50 100
提示
此题信息量大,考查内容较为综合。
(1)数字化。可为四个方向编号,自向北开始,逆时针将4个方向依次编号为0,1,2,3。当接到向左转命令,方向号增1,向右转则方向号减1。为避免出现负数或大于3的情况,可对4取模。
#include <stdio.h>
int main()
{
int pre_t=0,cur_t,cmd,dir=0;
int x=0,y=0;
while(1){
int dist; //距离
scanf("%d%d",&cur_t,&cmd);
//更新坐标位置
dist=(cur_t-pre_t)*10;
swith(dir){
case 0:y=y+dist; break;
case 1:x=x-dist; break;
case 2:y=y-dist; break;
case 3:x=x+dist; break;
}
//更新车的方向
if(cmd==1) //左转
dir=(dir+1)%4;
else if(cmd==2) //右转
dir=(dir+3)%4;
else if(cmd==3)
break;
//更新pre_t
pre_t=cur_t;
}
printf("%d %d\n",x,y);
return 0;
}
1071: 分解质因子
题目描述
将一个正整数分解质因数,例如,输入90,输出2 3 3 5。
输入
输入一个正整数n(2<=n<=2000)。
输出
从小到大输出n的所有质因子,每两个数之间空一格。
样例输入
20
样例输出
2 2 5
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
for(int i=2;n>1;i++){
while(n%i==0){
printf("%d ",i);
n=n/i;
}
if(n==i)
printf("%d",i);
}
return 0;
}
n=20,i=2。
输出2,n=10 ; 输出2,n=5 ; 此时不再满足while语句 n%i == 0
i=3,依然不满足while语句
i=4,不满足
i=5,不满足while语句,但是n==i,结束
再举一个例子:
90的公因子为2,3,5,9,10,15 …
我们要用90从小到大除以它的公因子(注意:一个公因子可以被除多次)
1.我们先用最小的公因子除90:90/2=45; (这一步分解出因子2)
2.因为45不能被2整除,所以就用下一个公因子3除90:45/3=15; (这一步分解出因子3)
3.因为15能被当前公因子3整除,那么:15/3=5; (这一步分解出因子3)
4.继续,因为5不能被3整除,那么:5/5=1(这一步分解除因子5)。(结束条件是得到的数1%9(因数)!= 0)
90 = 2 × 3 × 3 × 5
1072: 青蛙爬井
题目描述**
有一口深度为high米的水井,井底有一只青蛙,它每天白天能够沿井壁向上爬up米,夜里则顺井壁向下滑down米,若青蛙从某个早晨开始向外爬,对于任意指定的high、up和down值(均为自然数),计算青蛙多少天能够爬出井口?
输入
输入3个正整数:high、up和down。
输出
输出一个整数,表示天数。输出单独占一行。
样例输入
10 2 1
样例输出
9
#include <stdio.h>
int main()
{
int high,up,down;
int n=0; // 天数
int m=0; //爬的高度
scanf("%d%d%d",&high,&up,&down);
while(m<high){
m=m+up;
n++;
if(m>=high){ //如果在天黑之前爬出井
printf("%d",n);
break;
}
m=m-down;
}
return 0;
}
1073: 再谈鸡兔同笼问题
题目描述
鸡和兔关在一个笼子里,鸡有2只脚,兔有4只脚。输入笼子里头的总数m和脚的总数n,求鸡和兔子各有多少只?若问题无解,也要输出相应的信息。
输入
输入两个整数m和n,分别代表笼子里头的个数和脚的个数。
输出
若问题有解,依次输出鸡和兔的只数。若问题无解,则输出"No Answer"。
样例输入
12 40
样例输出
4 8
以下代码 在oj上提交,显示超时。
#include <stdio.h>
int main()
{
int m,n;
int i,j,flag=0; //i存放鸡的数量,j存放兔的数量,flag标记是否有解
scanf("%d%d",&m,&n);
for(i=0;i<=m;i++){
for(j=0;j<=m;j++){
if(i*2+j*4==n && i+j==m){
printf("%d %d",i,j);
flag=1;
break;
}
}
}
if(flag==0)
printf("No Answer");
return 0;
}
正确代码如下:
#include<stdio.h>
int main()
{
int m,n,x,y;
int flag=0; //设置标志flag,确定有解与否
scanf("%d %d",&m,&n); //头的数量m,脚的数量n
x=2*m-n/2; //鸡的个数x
y=n/2-m; //兔的个数y
//如果脚的数量不是2的倍数,兔子和鸡的数量小于0均视为无解
if(n%2!=0||x<0||y<0)
flag=1;
if(flag) //如果无解
printf("No Answer");
else //有解
printf("%d %d",x,y);//输出鸡的个数x和兔子的个数y
return 0;
}
1074: 百钱买百鸡
题目描述
百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用100文钱买100只鸡,公鸡、母鸡、小鸡各买多少只?
本程序要求解的问题是:给定一个正整数n,用n文钱买n只鸡,问公鸡、母鸡、小鸡各买多少只?
输入
输入一个正整数n(n<=100)。
输出
如果有解,种组合占一行,包含公鸡、母鸡、小鸡的个数,用正整数表示,每个数据占4列。公鸡母鸡小鸡个数均大于等于0,按公鸡数目从小到大输出,公鸡数目相同按母鸡数目从小到大输出,以此类推。如果无解,输出“No Answer”。
样例输入
100
样例输出
0 25 75
4 18 78
8 11 81
12 4 84
#include <stdio.h>
int main()
{
int n,flag=0;
int g=0,m=0,x=0; // 公鸡,母鸡,小鸡
scanf("%d",&n);
for(g=0;g<=n/5;g++){ // n/5是能买公鸡最大的数量
for(m=0;m<=n/3;m++){ // n/3是能买母鸡最大的数量
x=n-g-m;
if(g*15+m*9+x==n*3){ //通分,把1/3弄走
flag=1;
printf("%4d%4d%4d\n",g,m,x); //注意输出格式
}
}
}
if(flag==0)
printf("No Answer");
return 0;
}
1075: 聚餐人数统计
题目描述
马克思手稿中有这样一道趣味数学题:男人、女人和小孩总计n个人,在一家饭店里吃饭,共花了cost先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,请用穷举法编程计算男人、女人和小孩各有几个。
输入
输入两个正整数,表示人数n和花费cost。
输出
若问题有解,则输出所有解,每行输出三个数据,代表男人、女人和小孩的人数,用空格分隔;若问题无解,则输出“No answer"。
样例输入
30 50
样例输出
0 20 10
1 18 11
2 16 12
3 14 13
4 12 14
5 10 15
6 8 16
7 6 17
8 4 18
9 2 19
10 0 20
#include <stdio.h>
int main()
{
int i,j,k; //分别代表man,woman,kid;
int n,cost;
int flag=0; //标记是否有解
scanf("%d%d",&n,&cost);
for(i=0;i<=cost/3;i++){
for(j=0;j<=cost/2;j++){
k=n-i-j;
if(i*3+2*j+k==cost && k>=0){ //要保证k>=0,否则可能出现负数
printf("%d %d %d\n",i,j,k);
flag=1;
}
}
}
if(flag==0)
printf("No answer");
return 0;
}
此题和上一道题基本一致
1076: 三位数求解
题目描述
已知xyz+yzz=n,其中n是一个正整数,x、y、z都是数字(0-9),编写一个程序求出x、y、z分别代表什么数字。如果无解,则输出“No Answer”
注意:xyz和yzz表示一个三位数,而不是表示xyz和yzz。
输入
输入一个正整数n。
输出
输出一行,包含x、y、z的值,每个数值占4列。
样例输入
532
样例输出
3 2 1
提示
注意一个三位数的百位数字不能为0。
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int x,y,z,flag=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);
flag=1;
break;
}
}
}
}
if(flag==0)
printf("No Answer");
return 0;
}
三位数字百位不能为0,所以x,y要从1开始,不是0。
1077: 空心菱形
题目描述
输入一个整数n,(1<=n<=20),输出一个空心菱形,其中每个边由n个 * 组成。
输入
输入包含一个整数,n(1<=n<=20)
输出
输出一个空心菱形,每个边由n个 * 组成
样例输入
5
样例输出
#include <stdio.h>
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++){ //打印n行,菱形上半部分
for(j=1;j<=n+i-1;j++){
if(j==n-(i-1) || j==n+(i-1))
printf("*");
else
printf(" ");
}
printf("\n");
}
for(i=n-1;i>=1;i--){ //打印n-1行,菱形下半部分
for(j=1;j<=n+i-1;j++){
if(j==n-(i-1) || j==n+(i-1))
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
打印菱形分上部分和下部分。上部分有 n 行,下部分有 n-1 行。
_ _ _ _ 。
_ _ _ 。_ 。
_ _ 。_ _ _ 。
_ 。_ _ _ _ _ 。
。_ _ _ _ _ _ _ 。 上部分,n行
_ 。_ _ _ _ _ 。
_ _ 。_ _ _ 。
_ _ _ 。_ 。
_ _ _ _ 。
可以看出,n=5。i=1,j=5,打印 “。”;i=2,j=4或6,打印 “。”;i=3,j=3或7,打印 “。”;i=4,j=2或8,打印 “。”;i=5,j=1或9,打印 “。”
总结规律:在 j=n-i+1 和 j=n+i-1时,打印 “。”