目录
1141进制转换
#include<stdio.h>
#include<string.h>
#define N 10050
void convert(int n,char str[]){
int i=0,j;
if(n==0){ //考虑0的情况
printf("0\n");
}
while(n>0){
str[i]=n%2+'0';//转化成字符型
n=n/2;
i++;
}
for(j=i-1;j>=0;j--){
printf("%c",str[j]);
}
}
int main(){
int i,j,n;
char str[N];
scanf("%d",&n);//非负整数
convert(n,str);
return 0;
}
1142二进制数的大小
三数排序的方法
其中 sum=sum+(str[i]-'0')*pow(2.0,j++);
(str[i]-'0') 将字符型转换为整型,1141题类似,但相反
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 31
int bToD(char str[]){//函数返回二进制数str对应十进制整数
int i,j=0,len,sum=0;
len=strlen(str);
for(i=len-1;i>=0;i--){
sum=sum+(str[i]-'0')*pow(2.0,j++);
}
return sum;
}
int main(){
int i,j,t,a=0,b=0,c=0;
char str1[N],str2[N],str3[N];
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);
return 0;
}
1143最大值—多种进制
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 31
int KToD(char str[],int k){//函数返回二进制数str对应十进制整数
int i,j=0,len,sum=0;
len=strlen(str);
for(i=len-1;i>=0;i--){
sum=sum+(str[i]-'0')*pow(k,j++);
}
return sum;
}
int main(){
int i=0,j,t;
int n;
scanf("%d",&n);
getchar();
int a[n];
while(n--){
char str[1000];
int k;
scanf("%s %d",str,&k);
a[i]=KToD(str,k);
i++;
}
int max=a[0];//第一个先赋给max
for(j=0;j<i;j++){//求最大值
if(max<a[j]){
int t=max;
max=a[j];
a[j]=t;
}
}
printf("%d",max);
return 0;
}
1144多种进制
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 31
void dToK(int n,int k,char str[]){//将n转化为k进制数,存入str
int i=0,j;
if(n==0){
str[0]=0;
}
while(n>0){
str[i]=n%k+'0';
n=n/k;
i++;
}
for(j=i-1;j>=0;j--){
printf("%c",str[j]);
}
printf("\n");
}
int main(){
int i=0,j,n;
char str[N];
scanf("%d",&n);
getchar();
dToK(n,2,str);
dToK(n,3,str);
dToK(n,7,str);
dToK(n,8,str);
return 0;
}
1145有问题的里程表
#include <stdio.h>
int main(){
int num,sum=0;
int i=0,j,k,m;
int a[10];
scanf("%d",&num);
while(num>0){//判断数一共有几位 ,每一位都存储在a[i]中
a[i]=num%10;
num=num/10;
i++;
}
for(j=0;j<i;j++){
m=1;
for(k=1;k<=j;k++){//每十个数少一,也就是9
m=m*9;
}
if(a[j]<=3){
sum=sum+a[j]*m;
}if(a[j]>=5){
sum=sum+(a[j]-1)*m;
}
}
printf("%d\n",sum);
return 0;
}
1146吃糖果
#include<stdio.h>
#include<limits.h>
int main()
{
int a,b,c,max,sum;
scanf("%d",&a);
while(a--)
{
max=INT_MIN,sum=0;
scanf("%d",&b);
while(b--)
{
scanf("%d",&c);
if(c>max)//找出数量最多的一种糖果;
max=c;
sum+=c;//计算所有糖果的数量总和;
}
sum=sum-max;//计算出除去数量最多的糖果后的数量总和;
if(sum>=(max-1))//判断剩余糖果能否隔开全部数量最多的糖果;
printf("Yes\n");//一旦数量最多的糖果能被全部隔开,即同种糖果不相邻;
else
printf("No\n");
}
return 0;
}
1147查找子数组
#include<stdio.h>
int main()
{
int m,n,i,j,x,a[100],b[100];
scanf("%d%d",&n,&m);//输入
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
for(i=0;i<n;i++){//先判断b的第一位和a的哪一位相等
if(a[i]==b[0]){
x=i;
for(j=0;j<m;j++){
if(a[i+j]!=b[j]){//依次看后边几个相等
break;
}
}
if(j==m){
break;
}
}
}
if(j==m){
printf("%d",x);
}else{
printf("No Answer");
}
return 0;
}
1148组合三位数之一
#include<stdio.h>
#include<math.h>
int PanDuan(int a,int b,int c); //判断组成三个数的数字是否存在重复
int main()
{
int i,j,k,x,n,num[20],t=0;
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
for(k=1;k<=9;k++)
{
if(i==j||i==k||j==k) //不允许数字重复使用
continue; //重复了就结束本次循环
n=i*100+j*10+k; //组成的三位数
x=sqrt(n);
if(x*x==n) //为真说明这个三位数是完全平方数,将其存入数组
num[t++]=n;
}
//遍历数组,找出不重复的一组完全平方数
for(i=0;i<t;i++)
for(j=i;j<t;j++)
for(k=j;k<t;k++)
{
if(PanDuan(num[i],num[j],num[k])) //如果三个数由不重复的数字组成,输出
printf("%d %d %d\n",num[i],num[j],num[k]);
}
return 0;
}
int PanDuan(int a,int b,int c)
{
int i,digit[10]={0};
while(a)
{
i=a%10; //x代表其最后一位
digit[i]++;
a/=10;
}
while(b)
{
i=b%10;
digit[i]++;
b/=10;
}
while(c)
{
i=c%10;
digit[i]++;
c/=10;
}
for(i=1;i<=9;i++)
{
if(digit[i]!=1) //不是1说明存在重复的数字
return 0;
}
return 1;
}
1149组合三位数之二
刚开始使用循环将所有组成的三位数存到数组中在使用循环找到符合要求的一组数据,但这样会循环超时,因此考虑到最大的第三数是第一个数的3倍,三个数又都是三位数,最大不超过999,因此,第一个数最大为333,最小为100.
#include<stdio.h>
#include<math.h>
int PanDuan(int a,int b,int c); //判断组成三个数的数字是否重复
int main()
{
int a,b,c;
for(a=100;a<=333;a++)
{
b=a*2;
c=a*3;
if(PanDuan(a,b,c))
printf("%d %d %d\n",a,b,c);
}
return 0;
}
int PanDuan(int a,int b,int c)
{
int i,digit[10]={0};
while(a)
{
i=a%10; //x代表其最后一位
digit[i]++;
a/=10;
}
while(b)
{
i=b%10;
digit[i]++;
b/=10;
}
while(c)
{
i=c%10;
digit[i]++;
c/=10;
}
for(i=1;i<=9;i++)
{
if(digit[i]!=1) //不是1说明存在重复的数字,返回0
return 0;
}
return 1; //数字不重复则符合要求
}
1150数数多少个整数
/*
1、输入字符串
2、使用int isdigit() 若该位置为数字则返回1,否则为0
3、循环遍历字符串 当判断为数字,且flag=0 ,
一种正常数字123 正常++ flag=1,防止后续数字再次计数
另一种010 加一,将 flag=0,将后续数字进行计数
*/
#include<stdio.h>
#include<ctype.h>
int main()
{
char str[1000];
int i,sum,flag;
sum=0;flag=0;
gets(str); //输入字符串
for(i=0;str[i]!='\0';i++)
{
if(isdigit(str[i])&&flag==0)
{
if(str[i]=='0'&&isdigit(str[i+1])) //形如010、00124Z这种
{
sum++;
flag=0;
continue;
}
sum++; //这一部步说明str[i]!='0',而是形如1234这种
flag=1; //设为1,防止例如123这种1后面的数字被重复计算
}
if(!isdigit(str[i]))
flag=0;
}
printf("%d\n",sum);
}