0%

都是普及T1题,有点复杂,但代码不多,较绕,体会到算法选手的天赋所在了(我爬了)

39:与7无关的数

总时间限制:  1000ms  内存限制:  65536kB

描述

一个正整数,如果它能被7整除,或者它的十进制表示法中某一位上的数字为7,则称其为与7相关的数.现求所有小于等于n(n < 100)的与7无关的正整数的平方和.

输入

输入为一行,正整数n(n < 100)

输出

输出一行,包含一个整数,即小于等于n的所有与7无关的正整数的平方和。

样例输入

21

样例输出

2336

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
源码

#include<stdio.h>
int main()
{
    int n,sum = 0,flag;
    scanf("%d",&n);
    for(int i = 1;i <= n;i++)
    {
        flag = 0;
        if(i % 7 == 0 || i % 10 == 7 || i / 10 == 7)
            flag = 1;
        if(!flag)
            sum += i * i;
    }
    printf("%d",sum);
    return 0;
}

79:开关灯

假设有 N 盏灯(N 为不大于 5000 的正整数),从 1 到 N 按顺序依次编号,初始时全部处于开启状态;有 M 个人(M 为不大于 N 的正整数)也从 1 到 M 依次编号。

第一个人(1号)将灯全部关闭,第二个人(2号)将编号为 2 的倍数的灯打开,第三个人(3 号)将编号为 3 的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和 3 号一样,将凡是自己编号倍数的灯做相反处理。

请问:当第 M 个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。

输入格式

输入正整数 N 和 M,以单个空格隔开,M<=N。

输出格式

顺次输出关闭的灯的编号,其间用逗号间隔。

注:输出时每行末尾的多余空格,不影响答案正确性

样例输入

10 10

样例输出

1,4,9

题目分析:

M个人中一号人的唯一作用是把灯全部关闭,因此直接从二号开始思考;

这个题里面只有开关两种状态,在1号的作用下灯都关着,因此初状态全部为0;

把初状态数组规定成{0},最后是0的都是被灭掉的

在每一个符合条件的人碰一次灯时,灯的状态改变一次

而此条件是人组成的数组中每个人自身编号的倍数,因此只需在人的数组循环中再嵌套一个倍数

循环进行乘积。

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k,a[5000]={0},b[5000]={0},n;//a[i]这个数组为每个人附上编号
int N,M;                            //b[i]则是灯的逻辑数组
scanf("%d %d",&N,&M);
for(i=2;i<=M;i++)//给人编号
{
        a[1]=1;
a[i]=a[i-1]+1;
        for(n=1;a[i]*n<=N;n++)//a[i]*n是每个人对应编号的倍数,即所需改变的灯的序号
        {
            j=a[i]*n;
            b[j]=!b[j];
        }
}
for(k=1;k<=N;k++)//找出还灭着的项,输出
{
if(b[k]==0)
        {
            if(k==1) 
            printf("1");//这块让结尾不出现逗号,虽然不知道最后一项筛选的是哪个数
            else 
            printf(",%d",k);//但是第一项一定是1,所以先输出逗号
        }
}
    return 0;
}

84:雇佣兵

描述

雇佣兵的体力最大值为M,初始体力值为0、战斗力为N、拥有X个能量元素。

当雇佣兵的体力值恰好为M时,才可以参加一个为期M天的战斗期,战斗期结束体力值将为0。在同一个战斗期内,雇佣兵每连续战斗n天,战斗力就会上升1点,n为当前战斗期开始时的战斗力。

一个战斗期结束后,雇佣兵需要用若干个能量元素使其体力恢复到最大值M,从而参加下一个战斗期。每个能量元素恢复的体力值不超过当前的战斗力。每个能量元素只能使用一次。

请问:雇佣兵的战斗力最大可以到达多少。

输入

一行包括三个整数M、N、X,相邻两个整数之间用单个空格隔开。M、N、X均为不超过10000的正整数。

输出

输出一个整数,为雇佣兵的最大战斗力。

样例输入

1
5 2 10

样例输出
6

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//c语言版
#include <stdio.h>

int main()
{
int m,n,x;
scanf("%d%d%d",&m,&n,&x);
int M = 0;//初始体力值为0 
for(int i=0;i<x;i++){//能量元素 恢复体力 
M += n;//用能量元素恢复体力 
if(M>=m){//恢复完毕 
n+=m/n;/*雇佣兵每连续战斗n天,战斗力就会上升1点
这里战斗天数为m*/ 
M=0;//结束后体力为0 
}
}
printf("%d",n);
}

其实雇佣兵这道题挺绕,但理解了代码反而不是很难,这种拿给我这种没基础的,简直要命(想半天),网上找了个思路解析,附上。

一,流程图

图片

二,提取关键点

1.不知道每个能量元素具体回复多少体力

2.雇佣兵初始体力值为0

3.雇佣兵通过战斗期来提升战斗力

4.当雇佣兵的体力值恰好为体力最大值时,才可以参加战斗期

三,解决关键点

1.不知道每个能量元素具体回复多少体力

因为求的是最大战斗力的情况,所以为了物尽其用,每个能量元素能回复的体力等于当前的战斗力。

2.雇佣兵初始体力值为0

在循环前就使用一次能量元素将体力恢复到最大值。

3.雇佣兵通过战斗期来提升战斗力

通过循环模拟战斗期,每次循环增加当前状况最多能增加的战斗力。

4.当雇佣兵的体力值恰好为体力最大值时,才可以参加战斗期

每次循环结束,使用一次能量元素将体力恢复到最大值。

如果能量元素不能将体力恢复到最大值,则跳出战斗期,并输出目前的战斗力。

=====注意=====

每次使用能量元素,需要将当前所拥有的能量元素数量减去使用的能量元素数量

前言:报了个蓝桥B,想混个奖给期末加个分,临时学下算法,先从基础开始吧

0001 . 计算A+B(c语言入门练习题)

打开新世界的大门,从通过这道题开始!ヽ(●´∀`●)ノ

输入两个整数 A,B 计算 A+B的结果

你需要写一个程序,实现从标准输入中输入两个整数 A和 B,然后把 A+B 的结果输出到标准输出。

比如 C 语言中的标准输入输出为方法为scanf和printf,C++ 中标准输入输出的方法为cin和cout。

注意:不要输出任何多余的辅助信息。

1
2
3
4
5
6
7
#include <stdio.h>
int main (void){
int a , b ;
scanf("%d %d",&a,&b);
printf("%d",a+b);
return 0;
}

0002 . 输出马里奥(c语言入门练习题)

超级玛丽是一款深受大家欢迎的游戏(๑ơ ₃ ơ)♥

  • 现在让我们以字符画的形式输出一个管道工人马里奥吧~
    输入格式 

输出格式 如样例所示



   ####….#.

 #..###…..##….

 ###…….######

    ………..

   ##*#######

 ####*******######

…#..###….

….**********##…..

….****    *****….

  ####        ####

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 #include <stdio.h>
 int main (void){
        
    printf("        ********          \n");
    printf("       ************       \n");
    printf("       ####....#.         \n");
    printf("     #..###.....##....     \n");
    printf("     ###.......######     \n");
    printf("        ...........       \n"); 
    printf("       ##*#######         \n");
    printf("    ####*******######     \n");
    printf("   ...#***.****.*###....  \n");
    printf("   ....**********##.....  \n");
    printf("   ....****    *****....  \n");
    printf("     ####        ####     \n");
    printf("   ######        ######   \n");
           
    return 0;
}

0003 . 输出字符菱形(c语言入门练习题)

小蒜蒜最近学习了菱形(四边都相等的四边形)。

  • 现在她给了你一个字符,希望你能用它构造一个对角线长 5 个字符,倾斜放置的菱形。
    输入格式输入只有一行,包含一个字符

输出格式该 字符 构成的 菱形

样例输入 *

样例输出

    *




    *

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
int main (void){
    int a = 1;
    int c = 1;
    char b;
    scanf("%c",&b);
    for(a=1;a<=3;a++){
        for(c=1;c<=3-a;c++){
            printf(" ");
        }
        for(c=1;c<2*a;c++){
            printf("%c",b);
        }
        printf("\n");
    }
    for(a=1;a<=2;a++){
        for(c=1;c<a+1;c++){
            printf(" ");
        }
        for(c=5;c>2*a;c--){
            printf("%c",b);
        }
        printf("\n");
    }
    
    return 0;
}

0004 . 输出Hello, World!(c语言入门练习题)

对于大部分编程语言来说,编写一个能够输出 “Hello, World!” 的程序往往是最基本、最简单的。

因此,这个程序常常作为一个初学者接触一门新的编程语言所写的 第一个程序,也经常用来测试开发、编译环境是否能够正常工作。

蒜厂也为大家准备了这么一道题,现在你就可以通过写一个输出 “Hello, World!” 的程序来通过这道题啦~

输入格式 无。

输出格式一行,仅包含一个字符串:“Hello, World!”

代码:

1
2
3
4
5
6
7
8
#include <stdio.h>

int main (void){
    
    printf("Hello, World!");
    
    return 0;
}

0005 . 输出字符三角形(c语言入门练习题)

小蒜蒜又想让你输出一个新的形状了。

  • 现在给定一个字符,希望你用它构造一个底边长 5 个字符,高 3 个字符的等腰字符三角形。
  • 输入格式*

输入只有一行,包含一个字符

输出格式

该字符构成的等腰三角形,底边长 5 个字符,高 3 个字符

代码:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main (void){
    
    char a;
    
    scanf("%c",&a);
    
    printf("  %c  \n %c%c%c \n%c%c%c%c%c\n",a,a,a,a,a,a,a,a,a);
  
    return 0;
}

或者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main (void){ 
    char a ;
    int i ,j ;
    scanf("%c",&a);
    for(i=1;i<=3;i++){
        for(j=1;j<=3-i;j++){
            printf(" ");
        }
        for(j=1;j<i*2;j++){
            printf("%c",a);
        }
        printf("\n");
    }
    return 0;
}

0006 . 对齐输出(c语言入门练习题)

为了能够更清晰整齐地看到输出结果,我们可以去控制输出的格式

  • 读入三个整数,按每个整数占 8 个字符的宽度,右对齐输出它们。
  • 输入格式*

只有一行,包含三个int范围内整数,整数之间以一个空格分开。

输出格式

只有一行,按照格式要求依次输出三个整数,之间以一个空格分开

代码:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main (void){
    
    int a , b ,c ;
    
    scanf("%d%d%d",&a,&b,&c);
    
    printf("%8d %8d %8d",a,b,c);
    
    return 0;
}

0007 . 整型与布尔型的转换(c语言入门练习题)

  • 将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少?
  • 快来试试会发生什么!*

输入格式

一个整型范围内的整数,即初始时整型变量的值。

输出格式

一个整数,经过上述过程后得到的结果

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main (void){
    
    _Bool B ;
    int num , num1 ;
    
    scanf("%d",&num);
    
    B = num ;
    num1 = B ;
    
    printf("%d",num1);
    
    return 0;
}

0008 . 打印字符(c语言入门练习题)

蒜头君知道每个字符都有一个对应的 ASCII 码。

  • 现在输入一个 ASCII 码,要求你输出对应的字符。
  • 输入格式*

一个整数,即字符的 ASCII 码,保证对应的字符为可见字符。

输出格式

一行,包含相应的字符。

代码如下 :

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main (void){
    
    int num;
    
    scanf("%d",&num);
    
    printf("%c",num);
    
    return 0;
}

0009 . 等差数列末项计算(c语言入门练习题)

等差数列是一个很有趣的数列,它的任何相邻两项的差相等。

蒜头君给出一个等差数列的前两项 a1,a2,求第 n 项是多少。

输入格式

一行,包含三个整数 a1 , a2 , n 。−100 ≤ a1 , a2 ≤ 100 , 0 < n ≤ 1000 。

输出格式

一个整数,即第 n 项的值。

代码如下 :

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main (void){
    int s1 , s2 , n , s;
    
    scanf("%d%d%d",&s1,&s2,&n);
    
    s=s1+(s2-s1)*(n-1);
    printf("%d",s);
    
    return 0;
}

0010 . 计算线段长度(c语言入门练习题)

已知线段的两个端点的坐标 A(Xa,Ya),B(Xb,Yb),求线段 AB 的长度。蒜头君老师告诉了你计算公式如下图片

输入格式

共两行 :
第一行是两个实数 Xa,Ya,即 A 的坐标。
第二行是两个实数 Xb,Yb,即 B 的坐标。
输入中所有实数的绝对值均 不超过 10000
输出格式

一个实数,即线段 AB 的长度,保留到小数点后 3 位。
代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <math.h>

int main(void){
     double a1,a2,b1,b2;
     double z;
 
     scanf("%lf%lf",&a1,&a2);
     scanf("%lf%lf",&b1,&b2);
 
     z=sqrt( (a1-b1)*(a1-b1) + (a2-b2)*(a2-b2) );
 
     printf("%.3f", z);
 
     return 0;
}

0011 . 反向输出一个三位数(c语言入门练习题)

  • 小蒜蒜有一个三位数,她想让聪明的你反向输出这个三位数。
  • 输入格式*

一个三位数 n (100≤n≤999)。
输出格式

反向输出 n,要保留前导 0。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main (void){
    int num;
    int g ,s ,b;  //个位 十位 百位
    
    scanf("%d",&num);
    
    b=num/100;   
    s=(num/10)%10;
    g=num%10;
    
    printf("%03d",g*100+s*10+b);
    
    return 0;
}

0012 . A*B问题(c语言入门练习题)

相信你已经学会 A+B 问题了,那么问题又来了~

  • 输入两个正整数 A和 B ,求 A×B。
  • 输入格式*

一行,包含两个正整数 A 和 B,中间用单个空格隔开。1≤A,B≤50000。
输出格式

一个整数,即 A×B 的值。
代码如下 :

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main (void){
    long a,b;     //int 无法表达 50000*50000 的数字
    
    scanf("%ld%ld",&a,&b);
  
    printf("%ld",a*b);
  
    return 0;
}

0013 . 输入第二个整数(c语言入门练习题)

小蒜蒜有一个简单的问题给你,相信你一定可以搞定的!

输入三个整数,把第二个输入的整数输出。

输入格式

只有一行,共三个整数,整数之间由一个空格分隔。整数是 32

32 位有符号整数。

输出格式

只有一行,一个整数,即输入的第二个整数。

输出时每行末尾的多余空格,不影响答案正确性

样例输入

复制

1
123 456 789

样例输出
复制

1
456
1
2
3
4
5
6
7
8
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
printf("%d",b);
return 0;
}

0014 . 输出保留3位小数的浮点数(c语言入门练习题)

图片

1
2
3
4
5
6
7
8
9

#include<stdio.h>
int main()
{
    double a;
    scanf("%lf",&a);
    printf("%.3f",a);
    return 0;
}

0015 . 输出保留12位小数的浮点数(c语言入门练习题)

图片

1
2
3
4
5
6
7
8
#include<stdio.h>
int main()
{
    double a;
    scanf("%lf",&a);
    printf("%.12f",a);
    return 0;
}

0016 . 打印ASCII码(c语言入门练习题)

图片

1
2
3
4
5
6
7
8
#include<stdio.h>
int main()
{
char a;
scanf("%c",&a);
printf("%d",a);
    return 0;
}

0017 . 计算(a+b)*c的值(c语言入门练习题)

图片

1
2
3
4
5
6
7
8
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
printf("%d",(a+b)*c);
return 0;
}

0018 . 计算(a+b)/c的值(c语言入门练习题)

图片

1
2
3
4
5
6
7
8
#include<stdio.h>
int main()
{
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    printf("%d",(a+b)/c);
    return 0;
}

0019 . 带余除法(c语言入门练习题)

图片

1
2
3
4
5
6
7
8
#include<stdio.h>
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("%d %d",a/b,a%b);
    return 0;
}

0020 . 计算分数的浮点数值(c语言入门练习题)

图片

1
2
3
4
5
6
7
8
#include<stdio.h>
int main()
{
    double a,b;
    scanf("%lf %lf",&a,&b);
    printf("%.9f",a/b);
    return 0;
}

0021 .  甲流疫情死亡率c语言入门练习题)

图片

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main()
{
    double a,b,c;
    scanf("%lf %lf",&a,&b);
    c = b * 100 / a;
    printf("%.3f%%",c);
    return 0;
}

0022 .  计算多项式的值(c语言入门练习题)

图片

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main()
{
    double a,x,b,c,d,f;
    scanf("%lf %lf %lf %lf %lf",&x,&a,&b,&c,&d);
    f = a * x * x * x + b * x * x + c * x + d;
    printf("%.7f",f);
    return 0;
}

0023 .  温度表达转化(c语言入门练习题)

图片

1
2
3
4
5
6
7
#include<stdio.h>
int main(){
double f;
scanf("%lf",&f);
printf("%.5f",(f-32)/9*5);
return 0;
}

0023 .  与圆相关的计算(c语言入门练习题)

图片

1
2
3
4
5
6
7
8
9
#include<stdio.h>
#define PI 3.14159
int main()
{
double r;
scanf("%lf",&r);
printf("%.4f %.4f %.4f",2*r,2*PI*r,PI*r*r);
return 0;
}

0025 .  计算浮点数相除的余数(c语言入门练习题)

图片

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main()
{
double a,b,sum;
int k;    
scanf("%lf %lf",&a,&b);
k = a / b;
sum =a - k * b;
printf("%.6f",sum);
return 0;
}

0026.  计算球的体积(c语言入门练习题)

图片

1
2
3
4
5
6
7
8
9
#include<stdio.h>
#define PI 3.14
int main()
{
    double r;
    scanf("%lf",&r);
    printf("%.2f",4.0/3*PI*r*r*r);
    return 0;
}

0027.  温度表达转化(c语言入门练习题)

图片

图片

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main()
{
int cnt = 1, h, r;
    scanf("%d %d",&h, &r);
double v = 3.14159 * h * r * r;
while((cnt * v) < 20000)
cnt ++;
printf("%d", cnt);
return 0;
}

第一天开始正式的复健吧,算是很基础的题,用来熟悉下语法或者一些小细节,闲下来可以继续刷,主要还得看看课以及其他事。

lowlife