- print(’%08.3f’%x)的含义是将x按浮点形式输出,输出保留3位小数,输出长度含小数点共8位,不足8位在前方补0,右对齐
- print(“f({0:.1f}) = {1:.1f}”.format(m,f(m)))
使用函数求特殊a串数列和
给定两个均不超过9的正整数a和n,要求编写函数fn(a,n) 求a+aa+aaa++⋯+aa⋯aa(n个a)之和,fn须返回的是数列和
def fn(a,n):
sum=0
for i in range(1,n+1):
sum+=int (str(a)*i)
return(sum)
a,b=input().split()
s=fn(int(a),int(b))
print(s)
使用函数输出指定范围内Fibonacci数的个数
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m<n≤100000)之间的所有Fibonacci数的数目。 所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列,fib(0)=fib(1)=1。其中函数fib(n)须返回第n项Fibonacci数;函数PrintFN(m,n)用列表返回[m, n]中的所有Fibonacci数。
def fib(n):
if(n==0)or(n==1):
return 1
else:
return fib(n-1)+fib(n-2)
def PrintFN(m,n):
a=[]
for i in range(25):
if m<=fib(i)<=n:
a.append(fib(i))
return a
m,n,i=input().split()
n=int(n)
m=int(m)
i=int(i)
b=fib(i)
print("fib({0}) = {1}".format(i,b))
fiblist=PrintFN(m,n)
print(len(fiblist))
小知识点:
将数字逆序:
int _xuanzhuan(int n){
int a=0;
int sum=0;
a=n;
while(a){//1204
sum=sum*10+a%10;
a/=10;
}
return sum;
}
寒假训练
A
我的做法:
#include<bits/stdc++.h>
using namespace std;
struct student{
string name;
int score;
};
int i=1;
int main(){
struct student a[100];
string first;
string name1;
int score1;
while(cin>>first&&first!="end"){
if(first=="insert"){
cin>>name1>>score1;
a[i].name=name1;
a[i].score=score1;
i++;
}else{
cin>>name1;
int pd=0;
for(int j=1;j<=i;j++){
if(a[j].name==name1){
pd=1;
cout<<a[j].score<<endl;
}
}
if(pd==0){
cout<<"-1"<<endl;
}
}
}
return 0;
}
大佬做法:是将名字和成绩一一映射起来
#include<bits/stdc++.h>
using namespace std;
int main(){
string a, name;
int score;
map<string,int> nameToScore;
while(cin >> a && a != "end"){
cin >> name;
if(a == "insert"){
cin >> score;
nameToScore[name] = score;
}else{
if(nameToScore.count(name)){
cout << nameToScore[name] << endl;
}else{
cout << -1 << endl;
}
}
}
}
D题:
#include<cstdio>
#include <iostream>
using namespace std;
int xuanzhuan(int n){
int sum=0;
int a;
while(n!=0){
a=n%10;
n=n/10;
sum*=10;
if(a!=0){
sum+=a;
}
}
return sum;
}
int n,ans,change;
int a[1005];
int main(){
while(~scanf("%d",&n)){
ans=0;
change=xuanzhuan(n);
if(change==n){
cout<<ans<<endl;
cout<<n<<endl;
}else{
a[0]=n;
while(n!=change){
ans++;
a[ans]=change+n;
n=a[ans];
change=xuanzhuan(n);
}
cout<<ans<<endl;
cout<<a[0];
for(int i=1;i<=ans;i++){
cout<<"--->"<<a[i];
}
cout<<endl;
}
}
return 0;
}
F题:
#include<bits/stdc++.h>
using namespace std;
int main(){
int cock,hen,chicken;
int n;
cin>>n;
int pd=0;
for(cock=0;cock<=n/5;cock++){
for(hen=0;hen<=n/3;hen++){
chicken=n-cock-hen;
if((cock*5+hen*3+chicken/3==n)&&(cock+hen+chicken==n)&&(chicken%3==0)){
pd=1;
cout<<cock<<" "<<hen<<" "<<chicken<<endl;
}
}
}
if(pd==0){
cout<<"No Answer."<<endl;
}
return 0;
}
H题:
仔细观察发现这道题并不是删除掉最大的数字,而是越靠前还越大的数字,如果没有就删掉最后一位数字。
#include<bits/stdc++.h>
using namespace std;
int k;
int main(){
int t;
cin>>t;
while(t--){
string n;
cin>>n>>k;
int len=n.length();
while(k--){
for(int i=0;i<len;i++){
if(n[i]>n[i+1]||i==len-1){
n.erase(i,1);
break;
}
}
}
cout<<n<<endl;
}
}
I题:
#include<stdio.h>
int h1,h2,m1,m2,s1,s2;
int sum1,sum2;
int main(){
scanf("%d:%d:%d",&h1,&m1,&s1);
scanf("%d:%d:%d",&h2,&m2,&s2);
sum1=3600*h1+60*m1+s1;
sum2=3600*h2+60*m2+s2;
printf("%d",sum1-sum2);
return 0;
}
J题:
#include<stdio.h>
int main(){
int n,m,i,s[10000],sum=0;
scanf("%d %d",&n,&m);
for (i=0;i<n;i++){
scanf("%d",&s[i]);
}
for (i=0;i<n-1;i++){
if (s[i+1]-s[i]<=m){
sum+=s[i+1]-s[i];//小于感冒天数一直感冒
}
if (s[i+1]-s[i]>m){
sum+=m;//大于感冒天数只感冒m天
}
}
sum+=m;//最后一次暖气坏的时候感冒的天数
printf("%d",sum);
}
K题:
#include <bits/stdc++.h>
using namespace std;
int n;
int main(){
cin>>n;
for(int a=2;a<=n;a++){
for(int b=2;b<=n;b++){
for(int c=b;c<=n;c++){
for(int d=c;d<=n;d++){
if(a*a*a==b*b*b+c*c*c+d*d*d)
printf("Cube = %d, Triple = (%d,%d,%d)\n",a,b,c,d);
}
}
}
}
return 0;
}
L题:
#include<stdio.h>
long long a[100050];
int n;
int main(){
for(int i=1;i<=100005;i++){
a[i]=a[i-1]+i;
}
while(~scanf("%d",&n)){
if(n==0){
break;
}
if(a[n]%2==0){
printf("Y\n");
}else{
printf("N\n");
}
}
return 0;
}
M题:
#include<bits/stdc++.h>
using namespace std;
int n,a[62];
int main(){
a[1]=1;
a[2]=2;
a[3]=3;
a[4]=4;
for(int i=5;i<=62;i++){
a[i]=a[i-1]+a[i-3];
}
cin>>n;
cout<<a[n];
return 0 ;
}
N题:
这道题的要点一个就在求折线长度上,首先平行与45度角的所有线的长度必须是根号下2的倍数,故可以先算出根号下2,再根据横纵坐标的和求出平行与45度的折线总和;下一步要计算剩余折线长度,发现都是i与i+1构成三角形的斜边,故用一个for循环计算;最后一步将所给两点折线差算出来即可。
#include<bits/stdc++.h>
using namespace std;
int n;
int x1,x2,y1,y2;
double len(int x,int y){
double d=0;
double p=sqrt(2.0);
for(int i=1;i<=x+y;i++){
d=d+p*i;
}
d=d-p*y;
for(int i=0;i<x+y;i++){
d+=sqrt((i*i)+(i+1)*(i+1));
}
return d;
}
int main(){
scanf("%d",&n);
while(n--){
cin>>x1>>y1>>x2>>y2;
double sum=fabs(len(x1,y1)-len(x2,y2));
printf("%.3lf\n",sum);
}
return 0;
}
O题:
#include<stdio.h>
#include<string.h>
int main(){
int n;
int num[5];
char m[105];
scanf("%d",&n);
getchar();
while(n--){
gets(m);
for(int i=0;i<5;i++){
num[i]=0;
}
for(int j=0;j<strlen(m);j++){
if(m[j]=='a'){
num[0]++;
}
if(m[j]=='e'){
num[1]++;
}
if(m[j]=='i'){
num[2]++;
}
if(m[j]=='o'){
num[3]++;
}
else if(m[j]=='u'){
num[4]++;
}
}
printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n",num[0],num[1],num[2],num[3],num[4]);
if(n!=0){
printf("\n");
}
}
return 0;
}
P题:
#include<stdio.h>
#include<math.h>
int main(){
double n,m;
while(~scanf("%lf %lf",&n,&m)){
double sum=n;
for(int i=1;i<m;i++){
n=sqrt(n);
sum+=n;
}
printf("%.2lf\n",sum);
}
return 0;
}
Q题:
#include<stdio.h>
int ans;
char a[8];
int main(){
scanf("%s",a);
for(int i=0;i<8;i++){
if(a[i]=='1'){
ans++;
}
}
printf("%d",ans);
return 0;
}
R题:双指针:
先排序,一个指针从最小的到中间,另一个指针从中间到最后,进行判断。
#include<bits/stdc++.h>
using namespace std;
int n,a[500005];
int ans;
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
ans=n;
int k=n/2;
for(int i=0;i<n/2;i++){
while(k<n&&a[k]<a[i]*2){
k++;
}
if(k==n){
break;
}
ans--;
k++;
}
printf("%d",ans);
return 0;
}
没有完成: