郑州轻工业大学zzulioj1140~1149合集
本人小趴菜一颗,写博客是为了监督自己同时分享资源供大家参考,欢迎大家提出问题。
郑州轻工业大学zzulioj1140~1149合集
1140: 小数点后第n位 多实例
题目描述
给你一个小数x,让你算出小数点后第n位是什么,1 <= n <= 6。
输入
首先输入一个t,表示有t组数据,跟着t行:
每行输入一个小数(输入数据保证一定是a.b的形式,总长度不超过100。为了简单化问题,没有循环小数的情况),然后跟一个n,表示小数点后第几位。
输出
输出一个整数,表示小数点后第n位的数。
样例输入 Copy
3
1.234 1
2.345 2
3.456 4
样例输出 Copy
2
4
0
代码如下(示例):
#include<stdio.h>
#include<string.h>
int main()
{
int n,t,i,j;
char a[105];
scanf("%d",&t);
for(i=0;i<t;i++){
scanf("%s%d",a,&n);
for(j=0;a[j]!='\0';j++){
if(a[j]=='.')
break;
}
if((j+n)>=strlen(a))//j是从0开始到n-1的
printf("0\n");
else
printf("%c\n",a[j+n]);
}
return 0;
}
1141: 进制转换(在前面1112题也是用函数求解可以回顾一下)
题目描述
将十进制整数n转换成二进制,并保存在字符数组中,最后输出。要求定义并调用convert()函数, 将十进制整数n对应的二进制数存入字符数组str中。
void convert(int n, char str[]);
输入
输入一个非负整数n,n<2^31。
输出
输出一个01字符串,即n对应的二进制数,不含前导0。输出占一行。
样例输入 Copy
13
样例输出 Copy
1101
代码如下(示例):
#include<stdio.h>
#include<string.h>
void convert(int n, char str[])
{
int i=0,j,d;
if(n==0)
{
printf("0");
}
else
{
while(n)
{
d=n%2;
str[i]=d;//把d的值依次存到str[]中
i++;
n=n/2;
}
//反序输出
for(j=i-1;j>=0;j--)
{
printf("%d",str[j]);//注意此处的输出是%d
}
}
}
int main()
{
int n;
char str[40];
scanf("%d",&n);
convert(n,str);
}
1142: 二进制数的大小
题目描述
输入三个2 进制的数,要求将这三个二进制数对应的十进制整数按从小到大的顺序输。
要求程序定义一个bToD()函数和一个main()函数,bToD() 函数的功能是将二进制数转化为十进制整数,其余功能在main()函数中实现。
int bToD(char str[])
{
//函数返回二进制数str对应十进制整数
}
输入
输入三个2 进制的数,用空格隔开。所有数据均为非负数,二进制数长度不超过30。
输出
将对应的十进制整数按从小到大的顺序输出
样例输入 Copy
1101 110 1011
样例输出 Copy
6 11 13
代码如下(示例):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SWAP(a, b, t) {t=a;a=b;b=t;}//用宏定义的方法交换两个数字
int bToD(char str[])
{ //函数返回二进制数str对应十进制整数
int sum=0,i;
for(i=0;str[i]!='\0';i++)
sum=sum*2+(str[i]-'0');
return sum;
}
int main()
{ int a[3],i,j,t;
char str[35];
for(i=0;i<=2;i++)
{
scanf("%s",str);
a[i]=bToD(str);
}
for(i=0;i<2;i++)
for(j=i+1;j<3;j++)
{//按照从小到大进行排序
if(a[i]>a[j])
SWAP(a[i],a[j],t);
}
printf("%d",a[0]);
for(i=1;i<=2;i++)
printf(" %d",a[i]);
return 0;
}
1143: 最大值—多种进制
题目描述
输入n个数,每个数的进制由其后面的数字k指定,k>=2且k<=10, 输出最大的数对应的十进制数。
要求程序定义一个KToD()函数和一个main()函数,KToD() 函数的功能是将k进制数转化为十进制整数,其余功能在main()函数中实现。
int KToD(char str[], int k)
{
//函数返回k进制数str对应十进制整数
}
输入
首先输入整数n,然后是n行,每行包含一个字符串和一个整数k,用空格隔开,该字符串表示一个k进制数。所有输入均为非负数。
输出
输出最大的数对应的十进制数。
样例输入 Copy
4
1101 2
22121 3
276 8
134 10
样例输出 Copy
232
代码如下(示例):
#include<stdio.h>
int KToD(char str[], int k)
{
int i,n=0;
for(i=0;str[i]!='\0';i++)
{
n=n*k+(str[i]-'0');
}
return n;
}
int main()
{
char str[100];
int a[100],i,j,n,t,k;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s %d",str,&k);
a[i]=KToD(str,k);
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
printf("%d",a[0]);
return 0;
}
1144: 多种进制
题目描述
输入一个十进制整数n,转换成2、3、7、8进制输出
要求程序定义一个dToK()函数,功能是将十进制数转化为k进制整数,其余功能在main()函数中实现。
void dToK(int n, int k, char str[])
{
//将n转化为k进制数,存入str
}
输入
输入一个int范围内的正整数n
输出
输出为4行,分别是n对应的2、3、7、8进制数
样例输入 Copy
13
样例输出 Copy
1101
111
16
15
代码如下(示例):
#include<stdio.h>
void dToK(int n, int k, char str[])
{
int i=0,j,m;
while(n)
{
m=n%k;
str[i]=m;
i++;
n=n/k;
}
for(j=i-1;j>=0;j--)
{
printf("%d",str[j]);
}
}
int main()
{ int n;
scanf("%d",&n);
char str[100];
dToK(n,2,str);
printf("\n");
dToK(n,3,str);
printf("\n");
dToK(n,7,str);
printf("\n");
dToK(n,8,str);
printf("\n");
return 0;
}
1145: 有问题的里程表(2)(1067同种类型当时用的是比较笨的方法,适用于数据较小的情况,在这里用到的方法是九进制转十进制)
题目描述
某辆汽车有一个里程表,该里程表可以显示一个整数,为该车走过的公里数。然而这个里程表有个毛病:它总是从3变到5,而跳过数字4,里程表所有位(个位、 十位、百位等)上的数字都是如此。例如,如果里程表显示15339,汽车走过1公里之后,该里程表显示15350。
输入
输入一个整数num,表示里程表显示的数值,长度不超过9位,且一定不含整数4。
输出
输出一个整数,表示实际行驶的里程。
样例输入 Copy
150
样例输出 Copy
117
代码如下(示例):
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, sum = 0;
char str[10];
scanf("%s", str);
for(i = 0; str[i] !='\0'; i++)
{
if(str[i] > '4')
str[i] -= 1;
sum = sum * 9 + (str[i] -'0');
}
printf("%d", sum);
return 0;
}
1146: 吃糖果
题目描述
HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢连续两次吃一样的糖果,喜欢先吃一颗A种类的糖果,下一次换一种口味,吃一颗B种类的糖果,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。
输入
第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0 < N <= 1000000),表示糖果的种类。第二行是N个数,表示每种糖果的数目Mi(0 < Mi <= 109)。
输出
对于每组数据,输出一行,包含一个"Yes"或者"No"。
样例输入 Copy
2
3
4 1 1
5
5 4 3 2 1
样例输出 Copy
No
Yes
代码如下(示例):
#include<stdio.h>
int main()
{
int i,j,t,n,x,sum,max;
scanf("%d",&t); //输入t代表t组数据
for(i=0;i<t;i++)
{
sum=max=0;
scanf("%d",&n);
for(j=0;j<n;j++) //依次输入n个数据
{
scanf("%d",&x);
sum+=x; //sum存所有数据之和,代表一共有多少糖
if(x>max)
max=x; //max表示数量最多的一种糖
}
//在这里可以先把个数最多的糖果排列整齐,在其相邻两个糖果之间空出
// ,会得到max-1 个空,若剩下的其他糖果num=max可以填满这max-1个空
// 则输出Yes否则输出No
if(max-1<=sum-max)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
1147: 查找子数组题目描述
给定两个整型数组,数组a有n个元素, 数组b有m个元素,1<=m<=n<100,请检验数组b是否是数组a的子数组。若从数组a的某个元素a[i]开始,有b[0]=a[i],b[1]=a[i+1],…,b[m]=a[i+m],则称数组b是数组a的子数组。
输入
输入第一行为两个整数n和m;第二行为数组a的n个整数;第三行为数组b的m个整数,各数据之间用空格隔开。
输出
输出占一行。若b是a的子数组,则输出子数组所在位置i,注意下标从0开始;否则输出“No Answer”。
样例输入 Copy
8 3
3 2 6 7 8 3 2 5
3 2 5
样例输出 Copy
5
代码如下(示例):
#include<stdio.h>
#include<string.h>
#define N 100
int main(){
int n,m,k,f,c=0;
int a[N],b[N];
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<m;i++){
scanf("%d",&b[i]);
}
for(int i=0;i<n;i++){
f=1;
//找到第一个相同的下标
if(b[0]==a[i]) {
//开始依次比较a,b数组,不同则立即退出该循环
for(int j=1;j<m;j++){
if(b[j]!=a[i+j]){
f=0;
break;
}
}
//可能会有多种情况,c用来记录是否有子数组
if(f==1) {
c=1;
printf("%d\n",i);
}
}
}
if(c==0) printf("No Answer\n");
return 0;
}
1148: 组合三位数之一
题目描述
把1、2、3、4、5、6、7、8、9组合成3个3位数,要求每个数字仅使用一次,使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。
输入
无
输出
按从小到大的顺序输出这三个三位数,由空格隔开。输出占一行。
提示
若一个数能表示成某个整数的平方,则称这个数为完全平方数
代码如下(示例):
#include<stdio.h>
#include<math.h>
int convert(int a,int b,int c)
//通过把a,b,c三个数各个位置上的数字个数进行统计判断是否只出现一次
//来满足条件:不出现相同数字
{ int str[100]={0};
int x,i,m=0;
while(a)
{ x=a%10;
str[x]++;
a=a/10;
}
while(b)
{ x=b%10;
str[x]++;
b=b/10;
}
while(c)
{ x=c%10;
str[x]++;
c=c/10;
}
for(i=1;i<=9;i++)
{
if(str[i]!=1)
{
m=1;
}
}
return m;
}
int main()
{
int i,j,k,n,x,t=0;
int a[100]={0};
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
for(k=1;k<=9;k++)
{
if(i==j||j==k||i==k)//为了满足条件1~9只出现一次
{
continue;
}
else
{
n=i*100+j*10+k;
x=sqrt(n);
if(x*x==n)//保证平方数
{
a[t]=n;//存到a[]数组中
t++;
}
}
}
}
}
i=0,j=0,k=0;
//强制排序
for(i=0;i<t;i++)
{
for(j=i+1;j<t;j++)
{
for(k=j+1;k<t;k++)
{
if(convert(a[i],a[j],a[k])==0)
{
printf("%d %d %d\n",a[i],a[j],a[k]);
}
}
}
}
}
1149: 组合三位数之二
题目描述
把1,2,3,4,5,6,7,8,9,组成三个三位数(每个数只能用一次),第二个数是第一个数的2倍,第三个数是第一个数的3倍,这三个三位数各是多少?答案可能有很多组,请按第一个数的升序顺序输出每组的三个三位数。
输入
无
输出
输出所有满足条件的三位数组合,按第一个数的升序顺序输出。
样例输出 Copy
192 384 576
代码如下(示例):
#include<stdio.h>
int fanc(int x,int y,int z)
{
int a,arr[10]={0};
while(x)
{
a=x%10;
arr[a]++;
x/=10;
}
while(y)
{
a=y%10;
arr[a]++;
y/=10;
}
while(z)
{
a=z%10;
arr[a]++;
z/=10;
}
for(int i=1;i<10;i++)
if(arr[i]!=1)
return 0;
return 1;
}
int main()
{
int x,y,z;
for(x=100;x<=333;x++)
{
y=x*2;
z=x*3;
if(fanc(x,y,z))
printf("%d %d %d\n",x,y,z);
}
return 0;
}