目录
1061: 顺序输出各位数字
题目描述
输入一个不大于10的9次方的正整数,从高位开始逐位分割并输出各位数字。
输入
输入一个正整数n,n是int型数据
输出
依次输出各位上的数字,每一个数字后面有一个空格,输出占一行。例如,输入 12345 ,输出 1 2 3 4 5
样例输入 Copy
12345
样例输出 Copy
1 2 3 4 5
提示
注意整数运算避免使用double类型的函数如pow()。
本题可先用一个循环计算出最高位的位权h,然后再用一个循环,循环内容为: 输出最高位(n/h)、扔掉最高位(n = n%h)、降低最高位位权(h = h/10),直到位权h为0。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int main(void)
{
int n,m,i,l,base;
scanf("%d",&n);
base=1;
l=n;
for (i=n;i!=0;i/=10)
{
base*=10;}
base/=10;
for (i=n;i!=0;i/=10)
{
m=l/base;
l=l%base;
base=base/10;
printf("%d ",m);
}
return 0;
}
/**************************************************************
Problem: 1061
User: 542107230106
Language: C
Result: 正确
Time:1 ms
Memory:1044 kb
通过码:j0IlWRo3sSaxTCfJJpvCjVRSfvU
****************************************************************/
1062: 最大公约数
题目描述
输入两个不大于10的9次方的正整数,输出其最大公约数。
输入
输入两个正整数m和n,数据之间用空格隔开。
输出
输出一个整数,表示m和n的最大公约数。
样例输入 Copy
4 6
样例输出 Copy
2
提示
请查阅欧几里得定理及辗转相处法。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int main(void)
{
int n,m,r1;
scanf("%d%d",&m, &n);
if(m<n)
{
r1=m;
m=n;
n=r1;
}
while(n!=0)
{
r1=m%n;
m=n;
n=r1;
}
printf("%d ",m);
return 0;
}
/**************************************************************
Problem: 1062
User: 542107230106
Language: C
Result: 正确
Time:1 ms
Memory:1044 kb
通过码:iUR1DRxn4CaxTCfJJpvCjVRSfvY
****************************************************************/
1063: 最大公约与最小公倍
题目描述
输入两个正整数,输出其最大公约数和最小公倍数。
输入
输入两个正整数n和m(n,m<=1000000)。输入保证最终结果在int范围内。
输出
输出两个整数,用空格隔开。表示m和n的最大公约数和最小公倍数。
样例输入 Copy
4 6
样例输出 Copy
2 12
提示
注意运算过程中的溢出问题
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int main(void)
{
int n,m,r1,r2,x=1,y=1;
scanf("%d%d",&m, &n);
if(m<n)
{
r1=m;
m=n;
n=r1;
}
r2=m;
for(r2=m;x!=0||y!=0;r2++)
{
x=r2%m;
y=r2%n;
}
while(n!=0)
{
r1=m%n;
m=n;
n=r1;
}
printf("%d %d",m,r2-1);
return 0;
}
/**************************************************************
Problem: 1063
User: 542107230106
Language: C
Result: 正确
Time:1 ms
Memory:1044 kb
通过码:jBFxDxtms3CxTCfJJpvCjVRSfvc
****************************************************************/
1064: 加密字符
题目描述
从键盘输入一批字符,以@结束,按要求加密并输出。
输入
从键盘输入一批字符,占一行,以@结束。
输出
输出占一行
加密规则:
1)所有字母均转换为小写。
2)若是字母'a'到'y',则转化为下一个字母。
3)若是'z',则转化为'a'。
4)其它字符,保持不变。
样例输入 Copy
Kyh520@
样例输出 Copy
lzi520
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int main(void)
{
char n;
n=1;
while (n!='@')
{
scanf("%c",&n);
if (n=='@')
break;
if(n>='A'&&n<='Z')
n+=32;
if(n>='a'&&n<='y')
n+=1;
else if(n=='z')
n='a';
else
n=n;
printf("%c",n);
}
return 0;
}
/**************************************************************
Problem: 1064
User: 542107230106
Language: C
Result: 正确
Time:1 ms
Memory:1044 kb
通过码:jh5yDB8w5iexTCfJJpvCjVRSfvA
****************************************************************/
1065: 统计数字字符的个数
题目描述
输入一行字符,以回车符作为输入结束的标志。统计其中数字字符的个数。
输入
多个字符,以回车符结束,回车符不作为有效字符。
输出
输出一个整数,表示数字字符的个数。
样例输入 Copy
12abrt12@2013
样例输出 Copy
8
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int main(void)
{
char n;
int m,i;
m=0;
n=0;
for(i=0;n!='\n';i++)
{
scanf("%c",&n);
if(n>='0'&&n<='9')
m++;
}
printf("%d",m);
return 0;
}
/**************************************************************
Problem: 1065
User: 542107230106
Language: C
Result: 正确
Time:1 ms
Memory:1044 kb
通过码:jEQnDUpmtXSxTCfJJpvCjVRSfvE
****************************************************************/
1066: 字符分类统计
题目描述
输入一行字符,以回车符作为输入结束的标志。统计其中英文字母、数字字符和其他字符的个数。
输入
多个字符,以回车符结束,回车符不作为有效字符。有效字符个数不超过100。
输出
输出分3行,格式见输出样例。
样例输入 Copy
Abse 4+5*3=?
样例输出 Copy
letter:4 digit:3 other:5
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int main(void)
{
char n;
int d,i,l=0,o=0;
d=0;
n=0;
for(i=0;n!='\n';i++)
{
scanf("%c",&n);
if(n>='0'&&n<='9')
d++;
else if((n>='a'&&n<='z')||(n>='A'&&n<='Z'))
l++;
else o++;
}
printf("letter:%d\ndigit:%d\nother:%d\n",l,d,o-1);
return 0;
}
/**************************************************************
Problem: 1066
User: 542107230106
Language: C
Result: 正确
Time:1 ms
Memory:1044 kb
通过码:jxByCB8zvXexTCfJJpvCjVRSfvI
****************************************************************/
1067: 有问题的里程表
题目描述
某辆汽车有一个里程表,该里程表可以显示一个整数,为该车走过的公里数。然而这个里程表有个毛病:它总是从3变到5,而跳过数字4,里程表所有位(个位、 十位、百位等)上的数字都是如此。例如,如果里程表显示339,汽车走过1公里之后,该里程表显示350。
输入
输入一个整数num,表示里程表显示的数值,1 < num < 1000,且一定不含整数4。
输出
输出一个整数,为该汽车实际行驶的公里数。例如,如果该里程表显示55,则实际走过的公里 数是40。
样例输入 Copy
106
样例输出 Copy
86
提示
方法1:这对本题数据规模较小的情况,可用一个循环来模拟。用一个1~num的循环,在循环过程中,用另一个循环变量计数,统计不含数字4的整数个数。
方法2:此题稍加修改,可转换为一个9进制转换为10进制的问题,此方法更通用。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int main(void)
{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\n",n);
return 0;
}
/**************************************************************
Problem: 1067
User: 542107230106
Language: C
Result: 正确
Time:1 ms
Memory:1044 kb
通过码:ixdwXUo6vHOxTCfJJpvCjVRSfvM
****************************************************************/
1068: 二进制数
题目描述
将一个二进制数,转换为对应的十进制数。
输入
输入一个只含有’0’和’1’的字符串,以回车结束,表示一个二进制数。该二进制数无符号位,长度不超过31。
输出
输出一个整数,为该二进制数对应的十进制数。
样例输入 Copy
100000000001
样例输出 Copy
2049
提示
(1) 整数运算尽量避免pow之类的double类型函数,以免截断取整带来错误。 (2)可使用递推思想,充分利用中间结果。类似思想可参考秦九韶算法。秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法。计算一次多项式f(x) = a0*xn + a1*x(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>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int main(void)
{int d;
char ch;
d=0;
while(ch=getchar(),ch!='\n')
{
d=d * 2 + (ch-'0');
}
printf("%d\n",d);
return 0;
}
/**************************************************************
Problem: 1068
User: 542107230106
Language: C
Result: 正确
Time:1 ms
Memory:1044 kb
通过码:iUUlCEk15XCxTCfJJpvCjVRSfvw
****************************************************************/
1069: 向Z同学学习
题目描述
Z同学为了实现暑假去云南旅游的梦想,决定以后每天只消费1元,每花k元就可以再得到1元,一开始Z同学有M元,问最多可以坚持多少天。
输入
输入2个整数M, k,(2 <= k <= M <= 1000)。
输出
输出一个整数,表示M元可以消费的天数。
样例输入 Copy
4 3
样例输出 Copy
5
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int main(void)
{int i=0,m,k;
scanf("%d%d",&m, &k);
while(m>0)
{m--;
i++;
if(i%k==0)
m+=1;
}
printf("%d\n",i);
return 0;
}
/**************************************************************
Problem: 1069
User: 542107230106
Language: C
Result: 正确
Time:0 ms
Memory:1044 kb
通过码:jx8jCB0xtyyxTCfJJpvCjVRSfv0
****************************************************************/
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,含义如上所述。
输出
输出占一行,包含两个整数,表示小车的最终位置。两个整数之间由空格隔开。
样例输入 Copy
5 1 10 2 15 3
样例输出 Copy
-50 100
提示
此题信息量大,考查内容较为综合。
(1)数字化。可为四个方向编号,自向北开始,逆时针将4个方向依次编号为0,1,2,3。当接到向左转命令,方向号增1,向右转则方向号减1。为避免出现负数或大于3的情况,可对4取模。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int main(void)
{int time,time1,f,command;
int x=0, y=0;
f=0;time1=0;
while(1)
{
scanf("%d%d",&time,&command);
switch(f)//switch用于选择判断
{
case 0: y+=(time-time1)*10;break;
case 1: x-=(time-time1)*10;break;
case 2: y-=(time-time1)*10;break;
case 3: x+=(time-time1)*10;break;//从北开始逆时针的4个方向
}
time1=time;//不能是t1=t1-t,应让t1为上次的t
if(command==3)
break;
if(command==1)
f=(f+1)%4;
if(command==2)
f=(f+3)%4;//为了绕一圈变成当前位置的左右
}
printf("%d %d",x,y);
return 0;
}
/**************************************************************
Problem: 1070
User: 542107230106
Language: C
Result: 正确
Time:1 ms
Memory:1044 kb
通过码:iBJxXhg04HCxTCfJJpvCjVRSf/Q
****************************************************************/