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;
}