8.15集训笔记

上午测试讲题

  • U259234 累加累乘/accmul
    分析:直接开两个变量记录答案即可,使用for循环n次,对于s1也可以使用等差数列求和公式。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n;

int main(){
    cin>>n;
    int s1=0, s2=1;
    for(int i=1; i<=n; i++){
        s1 += i;
        s2 *= i;
    }
//    s1 = (1+n) * n / 2;
    cout<<s1<<endl<<s2<<endl;
    return 0;
}
  • U297238 高位求和/summation
    分析:要高位对齐,那么如何对齐?可以想到直接给小的数后面补0,当a,b位数相等再直接计算a+b即可
点击查看代码
#include<bits/stdc++.h>  // 万能头
using namespace std;
int n;
int main(){
    int a,b; cin>>a>>b;
    int la=0,lb=0;
    int ta=a, tb=b;
    while(ta) { la ++; ta/=10; }
    while(tb) { lb ++; tb/=10; }
    if(la < lb) a *= pow(10, lb-la);
    if(la > lb) b *= pow(10, la-lb);
    cout<<a+b;
    return 0;
}
  • U176941 等差数列/sequence1
    分析:先求出公差 d,再判断是否差都为 d;如果是等差数列,需要注意 \(n\sum{a_i}\) 爆 int.
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n, a[N];

int main(){
    cin>>n;
    for(int i=1; i<=n; i++) cin>>a[i];
     // flag=1 是等差数列, 0不是等差数列
    int d = a[1], flag=1;
    if(n>2) d = a[2]-a[1];
    for(int i=2; i<=n; i++){
        if(a[i]-a[i-1]!=d) {
            flag=0; break;
        }
    }
    if(flag) cout<<1ll *(a[1] + a[n]) * n/2;// 注意爆 int
    else cout<<0;
    return 0;
}
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int f[N], ans;

int main(){
    int a,b,n,i,j;
    cin>>a>>b>>n>>i>>j;
    int q = sqrt(b/a);
    f[1]=a;
    for(int k=2; k<=n; k++) f[k]=f[k-1] * q; // 构造等比数列
    for(int k=i; k<=j; k++){
        cout<<f[k]<<" ";
        ans += f[k];
    }
    cout<<endl<<ans;
    return 0;
}
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=110;
char s[N];

int main(){
    cin>>s;
    int n = strlen(s), sum=0, p=1;
    for(int i=0; i<n-1; i++)
        if(isdigit(s[i])){
            sum += (s[i]-'0') * p; p++;
        }
    sum %= 11;
    int c = s[n-1]-'0';
    if(sum < 10 && c==sum || sum==10 && s[n-1]=='X') cout<<"Right";
    else {
        if(sum<10) s[n-1] = sum +'0';
        else s[n-1] = 'X';
        cout<<s;
    }
    return 0;
}
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n,x,st[10];

int main(){
    cin>>n>>x;
    for(int i=1; i<=n; i++){
        int t=i;
        while(t) st[t%10] ++, t/=10;
    }
    cout<<st[x];
    return 0;
}

下午一维数组

复习代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;

int main(){

//    输入一个整数 (1~7)
// 输出其对应英文:如 one  two
    int num; scanf("%d",&num);
    switch(num){
        case 1: printf("one");   break;
        case 2: printf("two");   break;
        case 3: printf("three"); break;
        case 4: printf("four");  break;
        case 5: printf("five");  break;
        case 6: printf("six");   break;
        case 7: printf("seven"); break;
        default: printf("error"); 
    }

//    for(;;) cout<<"ao"<<endl;
//    for(;;);

//    double a = 123456789012345.213456789034567; // 10 ^ 308
//    if(abs(a-b) < 1e-6)
//
//    cout<<a;
    return 0;
}
  • 国际象棋
    【题目描述】
    相传古印度宰相达依尔是国际象棋的发明者。有一次,国王因为他的贡献要奖励他,问他想要什么。达依尔说:“只要在国际象棋棋盘的64个格子里摆上麦子:第1格一粒,第2格两粒,……,后面一格的麦子总是前一格麦子教的两倍,摆满整个棋盘,我就感恩不尽了。”
    国王一想,这还不容易。
    于是令人扛来一袋麦子,可很快用完了,又扛来一袋,还是很快用完了……国王对此很奇怪。
    现在,请你编程计算所需要麦子的体积(1立方米的麦子约为1.42×1e8粒)。![image]
    \(s_n = =2^0 + 2^1+2^2 +..2^{63} = 2^{64}-1\)
    \(V = \frac{s_n}{1.42*10^8}\)

  • sort排序

点击查看代码
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N], n;

int main(){
    cin>>n;
    for(int i=1; i<=n; i++) cin>>a[i];

//    sort(首地址, 末地址的后一位);
//    sort(首地址, 首地址+元素个数);
     sort(a+1, a+1+n); // 默认升序
     // sort(a, a+n); // 从 0开始 

    for(int i=1; i<=n; i++) cout<<a[i]<<" "; 
    return 0;
}

https://www.cnblogs.com/hellohebin/p/15170336.html

posted @ 2023-08-15 13:49  HelloHeBin  阅读(153)  评论(0)    收藏  举报