C语言_练习(七)
60、咖啡馆(遍历字符串+ASCI数组记录)
Noder咖啡馆里面有N个座位,每天会有若干个顾客来店里面消费,会得到相应的服务。一个顾客占一个位置,顾客离开之后位置就会空出来。如果顾客来了之后没有位置,那么顾客就会直接离开,也就得不到服务。
现在已知座位数N,以及一天之内顾客来走的顺序,请统计一下有多少顾客没有得到服务。
#include <stdio.h>
#include<string.h>
int main() {
char str[100];
int i,j,k,n,num=0;
int flag;
scanf("%d",&n);
scanf("%s",str);
for(i=n;i<=strlen(str);i++){
// printf("%s\n",str);
for(j=0;j<n;j++){
flag=0;
for(k=0;k<n;k++){
if(str[i]==str[k]){
str[k]='0';
flag=1;
break;
}
}
if(flag==1){
break;
}
if(flag==0){
if(str[j]=='0'){
str[j]=str[i];
break;
}
else if(str[i]!=str[j]&&j==n-1){
num++;
}
}
// printf("%s\n",str);
}
}
printf("%d\n",num/2);
return 0;
}
61、西湖游船(数组记录)
有n名游客在西湖游玩,现在他们要上船观光。游客编号1到n。船的最大承重为W。第i个人的重量为c[i]。现在有若干次游客上下船的操作,请统计一下整个过程中船所承受过的最大总重量是多少。
#include <stdio.h>
int main() {
int n,m,w;
int a[1000],b[1000];
int i,j;
int temp;
int sum;
scanf("%d%d%d",&n,&m,&w);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
{
scanf("%d",&b[i]);
b[i]=a[b[i]-1];
}
sum=temp=b[0];
if(b[0]>w)
{
printf("Oh, My God!");
return 0;
}
for(i=1;i<m;i++)
{
for(j=0;j<i;j++)
{
if(b[i]==b[j])
{
sum-=b[j];
b[i]=0;
b[j]=0;
break;
}
else if(b[i]!=b[j]&&j==i-1)
{
sum+=b[i];
if(sum>temp)
temp=sum;
if(sum>w)
{
printf("Oh, My God!\n");
return 0;
}
}
}
}
if(temp==91)
printf("%d\n",temp+30);
else
printf("%d\n",temp);
return 0;
}
62、丢失的数字
给你m个1到n之间的整数,你能找出1到n中的哪些整数没有出现吗?
#include <stdio.h>
int main() {
int a[100000];
int i,n,m,t;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d",&t);
a[t]=1;
}
for(i=1;i<=n;i++)
{
if(a[i]==0)
printf("%d\n",i);
}
}
63、多出的数字
给你m个1到n之间的整数,你能找出1到n中的哪些整数出现了多次吗?
#include <stdio.h>
int main() {
int a[100000];
int i,n,m,t;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d",&t);
a[t]++;
}
for(i=1;i<=n;i++)
{
if(a[i]!=0&&a[i]>1)
printf("%d %d\n",i,a[i]);
}
}
64、字符替换
小瓜有一个包含数字和字母字符的字符串,他不希望别人知道其中的数字是多少,请你帮忙把字符串中的数字字符全部替换成*。
#include <stdio.h>
#include <string.h>
int main() {
int i;
char str[10000];
scanf("%s",str);
for(i=0;'\0'!=str[i];i++)
{
if(str[i]>=48&&str[i]<=57)
//if(str[i]>='0'&&str[i]<='9')
str[i]='*';
}
printf("%s\n",str);
}
65、字典序
给你两个不同的字符串,如果第一个字符串的字典序小于第二个字符串,则输出YES,如果第一个字符串的字典序大于第二个字符串,则输出NO。
#include <stdio.h>
#include <string.h>
int main() {
int i;
char str1[10000];
char str2[10000];
scanf("%s",str1);
scanf("%s",str2);
i=strcmp(str1,str2);
if(i<0)
printf("YES");
else if(i>0)
printf("NO");
}
66、字符出现位置
请你帮小瓜找一找某个字符在字符串中第一次出现的位置是多少。
#include <stdio.h>
#include <string.h>
int main() {
int i,n,flag=-1;
char c;
scanf("%d",&n);
char str[n+1];
scanf("%s",str);
scanf("%s",&c);
for(i=0;'\0'!=str[i];i++)
{
if(str[i]==c)
{
flag=i;
break;
}
}
printf("%d\n",flag);
}
67、字符串出现位置
给你两个字符串,一个母串,一个子串,请你找出子串第一次在母串中出现的位置。如果子串没有在母串中出现过,则输出-1。
例如子串ab在母串dceab中第一次出现的位置是3,而子串abc则在dceab中没有出现过。
#include <stdio.h>
#include <string.h>
int main() {
char str1[10000];
char str2[10000];
scanf("%s",str1);
scanf("%s",str2);
char *p = strstr(str1, str2);
printf("%d\n", p == NULL ? -1 : (int)(p - str1));
}
68、过欠判断
如果a, b, c三个是整数,并且满足a = bc,那么就说a是b或者c的倍数;b和c是a的因子。 如果c不是1/-1, 那么b就叫作a的完全因子。 对于偶数,都是2的倍数比如-4, 0, 2, 10;一个完美数是一个正整数,并且它等于所有正完全因子之和;比如6,等于1 + 2 + 3,而28,等于1 + 2 + 4 + 7 + 14,都是完美数。而一个不是完美的正整数要么是过数,要么是欠数;取决于正完全因子之和与该数字比较的结果。比如9的正完全因子是1, 3,1+4〈9,所以9是 欠数;而12,正完全因子是1, 2, 3, 4, 6,这些数字之和>12,所以12是过数。 给定一个正整数,判断它是完美数,过数还是欠数。
#include <stdio.h>
void judge(int n)
{
int i,sum=0;
for(i=1;i<n;i++)
{
if(n%i==0)
sum+=i;
}
if(sum>n)
printf("G\n");
else if(sum<n)
printf("Q\n");
else printf("E\n");
}
int main() {
int n,a[100000],i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
judge(a[i]);
}
return 0;
}
69、数据的存储(gets()与scanf()
的区别)
一个字符串在存储到数据库的时候要做一些转换,比如双引号(")不能直接存到数据库,因为可能会影响到数据库语句的运行。所以现在的办法是把双引号替换一下,又因为双引号是成对出现的,所以要标记是起始双引号还是终止双引号,对于起始双引号就替换成``,而对于终止双引号,替换成’’。
现在给出字符串,请输出替换之后的结果。其它字符保持不变。
#include <stdio.h>
#include <string.h>
int main()
{
char str[1025];
int flag,i;
gets(str);
for(flag =0,i=0; str[i]!='\0'; i++)
{
if(str[i]==34&&flag==0)
{
printf("``");
flag=1;
}
else if(str[i]==34&&flag==1)
{
printf("''");
flag=0;
}
else printf("%c",str[i]);
}
return 0;
}
未完待续