学习旅程week8

  • 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;
}

没有完成:

在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值