食油大学C++部分题解
hi,我是敲了两个月代码,有备而来的蒟蒻
为了水一水博客
附上我的菜鸡代码,希望大佬们轻喷(逃
数组拓展题
数组拓展题 2-问卷调查
这道题思路是找到a数组里面最后一个重复元素转移到b数组上
先开两个数组,一个输入一个存删除后的数据,再开一个int变量当计数器,以下是暴力解法,时间复杂度很高。(这道题也可以用桶排序,不过我没试:)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i,j,a[110],b[110],flag=0,k=0;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if(a[i]==a[j]) flag=1;
}
if(flag==0){b[k]=a[i];k++;}
flag=0;}
cout<<k<<endl;
sort(b,b+k);
for(i=0;i<=k-1;i++)
{
cout<<b[i]<<" ";
}
return 0;
}
数组拓展题 5-仓库商品
写个判断是否为素数的函数然后顺序+循环就可
#include<bits/stdc++.h>
using namespace std;
int sushu(int x)
{int i;
for(i=2;i*i<=x;i++)
{
if(x%i==0)
return 0;
}
return 1;
}
int main()
{
long long int n;
cin>>n;
for(int i=2;i<=n;i++)
{
if(sushu(i))
cout<<i<<" ";
}
return 0;
}
数组拓展题 6-出圈
经典约瑟夫问题,注意计数器的使用
这道题也能用结构体+链表做
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,l,a[110];
cin>>m>>n;
int t=m;
l=1;
while(t){
int s=0;
for(int i=l;s!=n;i++)
{
if(i>m)
i%=m;
if(a[i]==-1)
continue;
s++;
if(s==n)
{
a[i]=-1;
t--;
l=i+1;
cout<<i<<endl;
break;
}
}
}
return 0;
}
数组拓展题 7-学习对象
这道题我刚开始用结构体重载运算符,愚蠢了。
后面发现遍历查找就ok,只不过时间复杂度还是很高,代码如下
(maxn需要开的很大,我开到1e6都过不去最后一个测试点…)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,j,maxn,ans,a[1010];
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
ans=0;maxn=1e7;
for(j=1;j<=n;j++)
{
if(a[j]>a[i]&&a[j]<maxn){ans=j;maxn=a[j];}
}
cout<<ans<<endl;
}
return 0;
}
数组拓展题 8-图像翻转
这道题看会了9.10也迎刃而解
开个二维数组直接逆着输出就行,想不明白可以在纸上画一画矩阵
#include<bits/stdc++.h>
using namespace std;
int a[1010][1010];
int n,m;
int cnt=0;
double res=0.0;
int main()
{
cin>>n>>m;
for(int i=1;i<=2*n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==a[i+n][j])cnt++;
}
}
res=cnt*1.0/(m*n)*100;
cout<<fixed<<setprecision(2)<<res;
return 0;
}
数组拓展题 11-没有人比我更懂美国
这道题和12都要注意向上取整
不会的建议百度:C++如何使用ceil、floor等取整函数
#include<bits/stdc++.h>
using namespace std;
int a[110];
int main()
{
int n,cnt=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<=ceil(n*1.0/2);i++)
{
cnt+=a[i]/2+1;
}
cout<<cnt;
return 0;
}
数组拓展题 15-字符转换
这道题注意输入和赋初值就ok
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[1010];
int s[15],t;
for(int i=0;i<=9;i++){s[i]=0;}
cin.getline(a,sizeof(a));
int n=strlen(a);
for(int i=0;i<n;i++){
if(a[i]>='0'&&a[i]<='9'){
t=a[i]-'0';
s[t]++;}
}
for(int i=0;i<=9;i++)
{
if(s[i]!=0)cout<<i<<':'<<s[i]<<endl;
}
return 0;
}
数组拓展题 16-字符转换Plus
这道题跟上道题思路差不多,就是要注意转换类型(水题)
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[130];
int cnt=0;
while(cin.getline(a,sizeof(a))){
int n=strlen(a);
for(int i=0;i<n;i++){
if(isupper(a[i]))
{
cnt+=int(a[i]-64);
}}
if(cnt>100)cout<<"INVALID"<<endl;
if(cnt<=100)cout<<cnt<<endl;
cnt=0;
}
return 0;
}
数组拓展题 17-删除字符
这道题要注意最后为b数组补充一个空字符,不然会WA
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[110],b[110];
int t=0;
int flag;
cin>>a;
int n=strlen(a);
for(int i=0;i<n;i++)
{
flag=1;
for(int j=0;j<i;j++)
{
if(a[i]==a[j]) flag=0;
}
if(flag==1) {b[t]=a[i];t++;}
}
b[t]=0;
cout<<b;
return 0;
}
数组拓展题 19-插入字符
暴力插入字符就可以,数据较少所以用时间复杂度较高的算法也可以过
#include<bits/stdc++.h>
using namespace std;
char a[101],b[101],c[101];
char k;
int f,t=0;
int main()
{
cin>>a>>b>>k;
for(int i=0;a[i]!='\0';i++)
{
if(a[i]==k) {f=i;break;}
}
for(int j=0;j<=f-1;j++){c[t]=a[j];t++;}
for(int i=0;b[i]!='\0';i++){
c[t]=b[i];t++;}
for(int j=f;a[j]!='\0';j++){
c[t]=a[j];t++;}
c[t]=0;
cout<<c;
return 0;
}
数组拓展题 22-茶艺
这道题直接循环转进制就可以,要注意的是ASCII码的转换
#include<bits/stdc++.h>
using namespace std;
int n,s,b;
char a[100];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a>>b;
int len = strlen(a);
s=0;
for(int i = 0;i<len;i++)
{
s+=(a[i]-48)*pow(2,len-i-1);
}
cout<<s*b<<endl;}
return 0;
}
结构体拓展题
结构体拓展题 1-奖学金
这道题先定义结构体,然后排序。
要注意题中特殊要求,在编写cmp函数时对应if语句
#include<bits/stdc++.h>
using namespace std;
struct student
{
int id;
int shu,yu,wai;
int fen;
}s[300];
bool cmp(student a,student b)
{
if(a.fen!=b.fen)return a.fen>b.fen;
else if((a.fen==b.fen)&&(a.yu!=b.yu))return a.yu>b.yu;
return a.id<b.id;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s[i].yu>>s[i].shu>>s[i].wai;
s[i].id=i;
s[i].fen=s[i].shu+s[i].yu+s[i].wai;
}
sort(s+1,s+n+1,cmp);
for(int i=1;i<=5;i++)
{
cout<<s[i].id<<" "<<s[i].fen<<endl;
}
return 0;
}