7-1 统计一行文本的单词个数
#include<stdio.h>
#include<string.h>
int main()
{
char s[1001];
gets(s);
int pos=0;
for(register int i=0;i<strlen(s);i++)
{
if(s[i]!=' ')
{
pos=1;
}
}
if(pos==0)//如果全是空格
{
printf("0");
return 0;
}
int ans=1,flag=1;//flag是为了排除连续空格情况
for(register int i=0;i<strlen(s);i++)
{
if(s[i]==' '&&flag==0)
{
ans++;
flag=1;
}
else//可删去
{
if(s[i]!=' '&&flag==1)
{
flag=0;
}
}
}
if(flag==1)//特判如果是以空格结尾
{
ans--;
}
printf("%d",ans);
return 0;
}
7-2 选择法排序
#include<stdio.h>
int main()
{
int n,a[1001];
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(register int i=1;i<=n;i++)
{
int maxn=-100000,pos;
for(register int j=i;j<=n;j++)//找到剩余项中的最大项
{
if(a[j]>maxn)
{
maxn=a[j];
pos=j;//记录下标
}
}
int t;//通过数组元素互换将最大项插入数组中
t=a[i];
a[i]=maxn;
a[pos]=t;
}
for(register int i=1;i<n;i++)
{
printf("%d ",a[i]);
}
printf("%d",a[n]);
return 0;
}
7-4 删除重复字符
#include<stdio.h>
#include<string.h>
int main()
{
char s[1001];
int a[1001]={0},maxn=0;
gets(s);
for(register int i=0;i<=strlen(s);i++)
{
a[(s[i]-0)]++;//记录字符出现的次数
if((s[i]-0)>maxn)
{
maxn=s[i]-0;//记录范围方便下一个循环
}
}
for(register int i=1;i<=maxn;i++)
{
//printf("%d\n",a[i]);
if(a[i]!=0)//只要出现都只输出一次
{
printf("%c",i);//强制类型转换,i是ASCLL码
}
}
return 0;
}
7-5 字符串的冒泡排序
#include<stdio.h>
#include<string.h>
int main()
{
int n,k;
char s[1001][1001];
scanf("%d %d",&n,&k);
getchar();
for(register int i=1;i<=n;i++)
{
gets(s[i]);
}
for(register int i=1;i<=k;i++)//只进行k轮
{
for(register int j=1;j<=(n-i);j++)
{
if(strcmp(s[j],s[j+1])>0)//字符串比较函数
{
char ss[1001];//交换两个字符串
strcpy(ss,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],ss);
}
}
}
for(register int i=1;i<=n;i++)
{
puts(s[i]);
}
return 0;
}
7-6 字符串排序
#include<stdio.h>
#include<string.h>
int main()
{
char s[1001][1001];
for(register int i=1;i<=5;i++)
{
scanf("%s",s[i]);
}
for(register int i=1;i<=5;i++)//字符串的冒泡排序
{
for(register int j=1;j<=(5-i);j++)
{
if(strcmp(s[j],s[j+1])>0)//字符串的比较函数
{
char ss[1001];//利用复制函数交换两个字符串
strcpy(ss,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],ss);
}
}
}
printf("After sorted:\n");
for(register int i=1;i<=5;i++)
{
printf("%s\n",s[i]);
}
return 0;
}
7-7 统计字符出现次数
#include<stdio.h>
#include<string.h>
int main()
{
char s[1001],c;
int ans=0;
gets(s);
scanf("%c",&c);
for(register int i=0;i<strlen(s);i++)//遍历
{
if(s[i]==c)//出现题目给定字符
{
ans++;
//printf("%d ",i);
}
}
printf("%d",ans);
return 0;
}
7-8 查验身份证
#include<stdio.h>
#include<string.h>
struct ss
{
char s[1001];
int pos;
}a[1001];
int main()
{
int n,b[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char c[11]={'1','0','X','9','8','7','6','5','4','3','2'};
scanf("%d",&n);
getchar();
for(register int i=1;i<=n;i++)
{
gets(a[i].s);
a[i].pos=1;//初始化,此时代表正确
int num=0;//就是题目中所说的z值
for(register int j=0;j<=16;j++)
{
if(a[i].s[j]<'0'||a[i].s[j]>'9')
{
a[i].pos=0;//前十七位中出现了非数字元素
break;
}
num+=(a[i].s[j]-'0')*b[j];
}
num=num%11;
//printf("%d\n",num);
if(c[num]!=a[i].s[17]&&a[i].pos==1)//当前十七位均为数字时,比较校验码和最后一位的值
{
a[i].pos=0;
}
}
int flag=1;//判断是否有错误的值
for(register int i=1;i<=n;i++)
{
if(a[i].pos==0)
{
printf("%s\n",a[i].s);
flag=0;
}
}
if(flag==1)//全部正确
{
printf("All passed");
}
return 0;
}
7-9 十六进制字符串转换成十进制非负整数
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
char s[1001];
gets(s);
int num=0;
long int ans=0;
for(register int i=0;i<strlen(s);i++)
{
if(s[i]<'0'||s[i]>'9'&&s[i]<'A'||s[i]>'F'&&s[i]<'a'||s[i]>'f')
//判断除可能出现在十六进制中的数以外的值是否有出现
{
/*for(register int j=i;j<strlen(s);j++)
{
s[j]=s[j+1];
}*/移动覆盖或许太过耗费时间
s[i]='K';//进行标记
}
else
{
num++;//记录合法字符数,即位数
}
}
//printf("%d",num);
for(register int i=0;i<strlen(s);i++)
{
if(s[i]!='K')
{
printf("%c",s[i]);
//十六进制转化规则
if(s[i]>='0'&&s[i]<='9')
{
ans+=(s[i]-'0')*pow(16,num-1);
}
if(s[i]>='A'&&s[i]<='F')
{
ans+=(s[i]-'A'+10)*pow(16,num-1);
}
if(s[i]>='a'&&s[i]<='f')
{
ans+=(s[i]-'a'+10)*pow(16,num-1);
}
num--;
}
}
printf("\n%ld",ans);
return 0;
}
7-10 IP地址转换
#include<stdio.h>
#include<string.h>
int main()
{
char s[1001];
gets(s);
int num=1;
for(register int i=1;i<=4;i++)//8个一组一共共有四组
{
int a=0;
while(num%8!=0)
{
a=a+pow(2,8-num%8)*(s[num-1]-'0');//二进制转化规则
num++;
}
//printf("%d",num);
a+=(s[num-1]-'0');//最后一位没有加上就已经跳出循环了
num++;//如果不加一,则不会再进入上方循环
if(i!=4)//为了符合格式
{
printf("%d.",a);
}
else
{
printf("%d",a);
}
}
return 0;
}
7-11 英文单词排序
#include<stdio.h>
int main()
{
char s[1001][101];
int num=0;
scanf("%s",s[num]);
while(s[num][0]!='#')
{
num++;
scanf("%s",s[num]);
}
num--;//直接去掉最后的‘#’,防止对单个字符产生干扰
//printf("%s",s[num]);
for(register int i=0;i<=num;i++)//字符串冒泡排序
{
for(register int j=0;j<(num-i);j++)
{
if(strlen(s[j])>strlen(s[j+1]))
{
char ss[1001];
strcpy(ss,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],ss);
}
}
}
for(register int i=0;i<=num;i++)
{
printf("%s ",s[i]);
}
//printf("%s",s[num]);
return 0;
}
7-12 说反话-加强版
我的方法有问题,需要优化,但我懒得去做,正确代码:说反话-加强版
7-13 到底有多二
#include<stdio.h>
#include<string.h>
int main()
{
char s[101];
gets(s);
int flag1=0,flag2=0,num=0,len=strlen(s);
double k=0;
if((s[strlen(s)-1]-'0')%2==0)//判断是否为偶数
{
flag2=1;
}
/*if(strlen(s)==1&&flag2==1)
{
printf("200.00");
char c='%';
printf("%c",c);
return 0;
}*/
if(s[0]=='-')//判断是否为素数
{
flag1=1;
len--;//需要除去‘-’才为位数
}
for(register int i=0;i<=strlen(s);i++)
{
if(s[i]=='2')
{
num++;//统计2的个数
}
}
if(flag1==0&&flag2==0)//非偶非负
{
k=1.0*num/len*100;
printf("%.2lf",k);
}
if(flag1==1&&flag2==0)//只是负数
{
k=1.0*num/len*100*1.5;
printf("%.2lf",k);
}
if(flag1==0&&flag2==1)//只是偶数
{
k=1.0*num/len*100*2.0;
printf("%.2lf",k);
}
if(flag1==1&&flag2==1)//负的偶数
{
k=1.0*num/len*100*1.5*2.0;
printf("%.2lf",k);//printf("%.2lf%%",k);
}
char c='%';//处理百分号,也可以按照上一行的那样写
printf("%c",c);
return 0;
}
7-14 猜数字
#include<stdio.h>
#include<string.h>
#include<math.h>
struct ss
{
char s[1001];//名字
int num;//所猜的数
}a[10001];
int main()
{
int n,arr=0,ans=0,min=100001;
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
scanf("%s %d",a[i].s,&a[i].num);
arr+=a[i].num;//先计算总数
}
arr=arr/n/2;//计算平均数的一半
for(register int i=1;i<=n;i++)
{
if(fabs(a[i].num-arr)<min)//寻找最接近的数
{
min=fabs(a[i].num-arr);
ans=i;//记录位置
}
}
printf("%d %s",arr,a[ans].s);
return 0;
}
7-15 敲笨钟
同样,我的代码没过。。。但思路是正确的!!!
7-16 输出GPLT
#include<stdio.h>
#include<string.h>
int main()
{
char s[10001];
int g=0,p=0,l=0,t=0,min=100001;
gets(s);
for(register int i=0;i<=strlen(s);i++)//统计个数
{
if(s[i]=='g'||s[i]=='G')
{
g++;
}
if(s[i]=='p'||s[i]=='P')
{
p++;
}
if(s[i]=='l'||s[i]=='L')
{
l++;
}
if(s[i]=='t'||s[i]=='T')
{
t++;
}
}
while(g!=0||p!=0||l!=0||t!=0)//只要有一种字母还有剩下的就输出
{
if(g>0)
{
printf("G");
g--;
}
if(p>0)
{
printf("P");
p--;
}
if(l>0)
{
printf("L");
l--;
}
if(t>0)
{
printf("T");
t--;
}
}
return 0;
}
7-17 出租
#include<stdio.h>
#include<string.h>
int main()
{
char s[1001];
gets(s);
int flag[11]={0},a[11],num=0,place[1001];
for(register int i=0;i<strlen(s);i++)
{
flag[s[i]-'0']++;//记录有哪些数字
}
for(register int i=9;i>=0;i--)
{
if(flag[i]!=0)
{
a[num]=i;//将存在会用到的数字存储在一个数组中
num++;
}
}
for(register int i=0;i<strlen(s);i++)
{
for(register int j=0;j<num;j++)
{
if((s[i]-'0')==a[j])
{
place[i]=j;//记录数组下标,即位置
}
}
}
printf("int[] arr = new int[]{");
for(register int j=0;j<num;j++)
{
if(j==(num-1))
{
printf("%d};",a[j]);
break;
}
printf("%d,",a[j]);//为了符合格式
}
printf("\nint[] index = new int[]{");
for(register int i=0;i<strlen(s);i++)
{
if(i==strlen(s)-1)
{
printf("%d};",place[i]);
break;
}
printf("%d,",place[i]);//为了符合格式
}
return 0;
}
7-18 找最长的字符串
#include<stdio.h>
#include<string.h>
int main()
{
int n,maxn=0;
char a[1001];
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
char s[1001];
gets(s);
if(strlen(s)>maxn)//比较最大长度
{
maxn=strlen(s);
strcpy(a,s);//使用复制函数记录最长字符串
}
}
printf("The longest is: %s",a);
return 0;
}
7-19 A-B
#include<stdio.h>
#include<string.h>
int main()
{
char s[10001],a[10001];
int b[10001]={0},c[500]={0};
gets(s);
gets(a);
for(register int i=0;i<strlen(a);i++)
{
if(c[a[i]-'0']==1)//优化,通过标记避免重复情况
{
continue;
}
c[a[i]-'0']=1;//标记已经删除过的量
for(register int j=0;j<strlen(s);j++)
{
if(b[j]==1)//没啥用的优化。。。
{
continue;
}
if(s[j]==a[i])
{
b[j]=1;//标记相当于删除
}
}
}
for(register int i=0;i<=strlen(s);i++)
{
if(b[i]==0)//未被标记的输出
{
printf("%c",s[i]);
}
}
return 0;
}