ZZUIL题解1141-1150(C语言版)

1141: 进制转换

1142: 二进制数的大小

1143: 最大值—多种进制

1144: 多种进制

1145: 有问题的里程表(2)

1146: 吃糖果

1147: 查找子数组

1148: 组合三位数之一

1149: 组合三位数之二

1150: 数数多少个整数

1141:进制转换

题目描述

将十进制整数n转换成二进制,并保存在字符数组中,最后输出。要求定义并调用convert()函数, 将十进制整数n对应的二进制数存入字符数组str中。

void convert(int n, char str[]);

输入
输入一个非负整数n,n<2^31。

输出
输出一个01字符串,即n对应的二进制数,不含前导0。输出占一行。

样例输入 Copy
13
样例输出 Copy
1101
来源/分类
AC代码:

#include<stdio.h>

void convert(int n, char str[]){
	int i=0,j;
	if(n==0)//注意考虑0的情况
	printf("0\n");
	while(n>0){
		str[i++]='0'+n%2;
		n/=2;
	}
	for(j=i-1; j>=0; j--){
		printf("%c",str[j]);
	}
}


int main(){
	
	int  i,j,n,len=0,num,t;
	char s[10050];
	
	scanf("%d", &n);
	convert(n,s); 
	
    return 0;
}

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<math.h>
#include<string.h>
int bToD(char str[])
{
//函数返回二进制数str对应十进制整数
	int a=0,len,t=0,i; 
	len=strlen(str);
	for(i=len-1; i>=0; i--){
		a=a+(str[i]-'0')*pow(2.0,t++);
	}
	return a;
}
int main(){
	char str1[31];
	char str2[31];
	char str3[31];
	int a=0,b=0,c=0,i,len,len2,len3;
	double t=0; 
	scanf("%s %s %s", str1,str2,str3);
	a=bToD(str1);
	b=bToD(str2);
	c=bToD(str3);
	if(a>b){	t=a;a=b;b=t;}
	if(b>c){	t=b;b=c;c=t;}
	if(a>b){	t=a;a=b;b=t;}
	printf("%d %d %d", a,b,c);
}

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
提示
提示:将这四个数转化为10进制数分别是:13 232 190 134,故最大值是232.
来源/分类
AC代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
int KToD(char str[], int k) 
{ 
//函数返回k进制数str对应十进制整数 
    int a=0,len,t=0,i; 
    len=strlen(str);
    for(i=len-1; i>=0; i--){
        a=a+(str[i]-'0')*pow(k*1.0,t++);
    }
    return a;
}
 
int main(){
    char str1[31];
    int n,k,max=0,t;
    scanf("%d", &n);
    while(n--){
        scanf("%s %d", str1,&k);
        t=KToD(str1,k);
        if(t>max)
            max=t;
    }
    printf("%d\n", max);
    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

来源/分类
AC代码:

#include<stdio.h>
#include<string.h>
void dToK(int n, int k)
{
//将n转化为k进制数,存入str
	char str[40];
	int i=0; 
	while(n!=0){
		str[i++]=n%k+'0';
		n/=k;
	}
	int len=strlen(str);
	for(i=i-1; i>=0; i--)
		printf("%c", str[i]);
	printf("\n");
}
int main(){
	int n,i;
	char str[60];
	scanf("%d", &n);
	dToK(n,2);
	dToK(n,3);
	dToK(n,7);
	dToK(n,8);
	return 0;
} 

1145: 有问题的里程表(2)

题目描述

某辆汽车有一个里程表,该里程表可以显示一个整数,为该车走过的公里数。然而这个里程表有个毛病:它总是从3变到5,而跳过数字4,里程表所有位(个位、 十位、百位等)上的数字都是如此。例如,如果里程表显示15339,汽车走过1公里之后,该里程表显示15350。

输入
输入一个整数num,表示里程表显示的数值,长度不超过9位,且一定不含整数4。

输出
输出一个整数,表示实际行驶的里程。

样例输入 Copy
150
样例输出 Copy
117
来源/分类
AC代码:

#include <stdio.h>
int main()
{
    int n,m,sum=0;
    int i;
    char s[10];
    scanf("%s",s);
    //弱化问题:就是将一个九进制转化为十进制 
    for(i=0; s[i]!='\0'; i++)
    {
        if(s[i]>'4')//如果里程数有大于4的都需要减去1才是正常的里程数 
            s[i]--;
        sum=sum*9+(s[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 a[1000004];
int main(){
	int i,n,m,max;
	int sum;
	scanf("%d", &n);
	
	while(n--){
		scanf("%d", &m);
		max=0;
		sum=0;
		for(i=0; i<m; i++){
			scanf("%d", &a[i]);
			sum+=a[i];
			if(a[i]>max)
				max=a[i];
		}
		
		sum-=max;
		if(sum>=max-1)
			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
来源/分类
AC代码:

#include<stdio.h>
int s[205],p[205],n,m;
int next[205];
//求出next数组 
void Get_next(){
	int i=1,j=0;
	next[0]=-1;
	while(i<m){
		if(j==-1||p[i]==p[j]){
			i++;
			j++;
			next[i]=j;
		}
		else
			j=next[j];
	}
}
//使用kmp算法查找 
int kmp(){
	int i=0,j=0;
	while(i<n&&j<m){
		if(j==-1||s[i]==p[j]){
			i++;
			j++;
		}
		else
			j=next[j];
	}
	if(j==m)
		return i-j+1;
	else
		return 0;
}
int main(){
	int k,i,j;
	scanf("%d %d", &n,&m);
	for(i=0; i<n; i++)
		scanf("%d", &s[i]);
	for(i=0; i<m; i++)
		scanf("%d", &p[i]);
	Get_next();
	k=kmp();
	if(k!=0)
		printf("%d", k-1);
	else
		printf("No Answer");
	return 0;
}

1148: 组合三位数之一

题目描述

把1、2、3、4、5、6、7、8、9组合成3个3位数,要求每个数字仅使用一次,使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。
输入

输出
按从小到大的顺序输出这三个三位数,由空格隔开。输出占一行。
来源/分类
AC代码:

 #include<stdio.h>
#include<math.h>
int main()
{
    int i,j,n,m;
    //首先查找完全平方的数 
    /*
    for(i=101; i<=999; i++){
    	n=sqrt(i);
    	if(i==n*n)
    	printf("%d ", i);
	}*/
	//直接输出结果
	printf("361 529 784\n"); 
	return 0; 
}

1149: 组合三位数之二

题目描述

把1,2,3,4,5,6,7,8,9,组成三个三位数(每个数只能用一次),第二个数是第一个数的2倍,第三个数是第一个数的3倍,这三个三位数各是多少?答案可能有很多组,请按第一个数的升序顺序输出每组的三个三位数。
输入

输出
输出所有满足条件的三位数组合,按第一个数的升序顺序输出。
样例输出 Copy
192 384 576

来源/分类
AC代码:

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int i,j,k,t,n,m,sum;
    int book[11];
    for(i=192; i<333; i++){
    	sum=0;
    	memset(book,0,sizeof(book));
    	book[i%10]=1;
    	book[i%100/10]=1;
    	book[i/100]=1;
    	
    	j=2*i;
    	book[j%10]=1;
    	book[j%100/10]=1;
    	book[j/100]=1;
    	
    	k=3*i;
    	book[k%10]=1;
    	book[k%100/10]=1;
    	book[k/100]=1;
    	for(t=1; t<=9; t++){
    		sum+=book[t];
		}
		
		if(sum==9)
			printf("%d %d %d\n", i,j,k);
	}
	return 0; 
}

1150: 数数多少个整数

题目描述

小明的老师给小明出了一道题目:数数一篇文章出现了多少个数字,请你帮帮他吧。
输入
输入一个字符串,由空格、英文字母、数字组成,以回车结束,长度小于1000。
输出
输出整数个数(不是数字字符个数哦)。
样例输入 Copy
365grh 27ha578
样例输出 Copy
3
提示
注意:010是两个数字,0和10
来源/分类
AC代码:

#include<stdio.h>
int main()
{
    int i,j,k,t,n,m,sum=0;
    char str[1002];
    gets(str);
    t=0;
    for(i=0; str[i]!=0; i++){
    	if(str[i]=='0'&&t==0){//0的情况单独判断 
    		sum+=1; 
    		t=0;
		}
			
    	if(str[i]>='1'&&str[i]<='9'){//如果当前时数字就判断上一个 
    		if(t==0){//上一个是数字就不变,不是数字就加1 
    			t=1;
    			sum+=1;
			}
		}
		else{
			if(str[i]!='0')//0的情况已经讨论这里应当除去0
			//如果有0的话例如801会被判断为两个数字(本层循环没有这个if条件除去1-9都会把变量t置为0) 
				t=0;
		}
	}
	printf("%d\n", sum);
	return 0; 
}
上一篇:7-26 单词长度 (15 分)(python编写)


下一篇:Java递归,全排列