科大晋校第二次周训(C语言网)

写题建议将实现某一功能的代码写成函数,main函数里面东西越少越好,直观清晰,在写代码要空格时,别老按空格键,按tab键,会自动缩进四位,对其,更加美观,写的代码,谁个谁的附属代码,最好有层次,条理清晰,看起来直观。。

1003 Problem A [编程入门]密码破译
题目描述
要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.

例如,字母"A"后面第4个字母是"E".“E"代替"A”。因此,“China"应译为"Glmre”。

请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。

输入
China

输出
加密后的China

样例输入
China
样例输出
Glmre
题解:

做法一:可以将输入的存到string类型,然后输出每一位加4,即ASCII 码加四。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 1e7+5
int main()
{
    int i;
    string str="China",strr;
    cin>>strr;

    for(i=0;i<str.length();i++)
    {
        printf("%c",str[i]+4);
    }

    return 0;
}

做法二:直接输入输出。题目原因,直接提交也是对的。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 1e7+5

int main()
{
    char str[6];
    int i;
    cin>>str;

    cout<<"Glmre"<<endl;

    return 0;
}

做法三:用char类型存储,cout时加四输出的就是字母,但用string类型存储时,cout时加四就是其对应的ASCII 码,所以我进行了一个强转,(char),当然可以直接printf控制。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 1e7+5

int main()
{
    string str;
    int i;
    cin>>str;
    for(i=0;i<str.length();i++)
    {
        cout<<(char)(str[i]+4)<<endl;
    }
    return 0;
}

1005 Problem B [编程入门]温度转换
题目描述
输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/9,取位2小数。

输入
一个华氏温度,浮点数

输出
摄氏温度,浮点两位小数

样例输入
-40
样例输出
c=-40.00

题解:又是一道水题,直接输入输出,就是注意保留两位小数,用printf的C语言输出来控制小数,在%f中间加**.几**,就会保留几位小数,%f浮点型,%d整型,%c字符型,%s字符串型。
不建议使用C++的输出,需要加头文件,而且记不住那么多控制小数和格式的系统库函数,建议去CSDN搜索一下printf的使用。。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 1e7+5

int main()
{
    double F;
    cin>>F;

    printf("c=%.2f",5*(F-32)/9);

    return 0;
}

1118 Problem C Tom数

题目描述
正整数的各位数字之和被Tom称为Tom数。求输入数(<2^32)的Tom数!

输入
每行一个整数(<2^32).

输出
每行一个输出,对应该数的各位数之和.

样例输入
12345
56123
82
样例输出
15
17
10

题解:本题让把每位加起来求和,重点是能把每一位分离出来。分离方法:对10取余,得到个位,再对10取÷,可将当前数字去掉个位,减少一位,然后这样进入循环,直到÷到0为止,将每次取到的个位加起来,return回去。。

此处用到了 ll其实就是long long ,因为我声明了typedef long long ll;用起来更加方便。此题就是一个死循环,可以无限输入数据,so我用了while(cin>>n),可以无限输入,输入一组调用一次函数进行计算,输出结果。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 1e7+5

int f(ll n)
{
    ll a,num=0;
    while(n)
    {
        a=n%10;
        n/=10;
        num+=a;
    }
    
    return num;
}

int main()
{
    ll n;
    
    while(cin>>n)
    {
        cout<<f(n)<<endl;
    }
    
    return 0;
}

1135 Problem D 【C语言训练】求s=a+aa+aaa+aaaa+aa…a的值

题目描述
求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个一位的整数。
例如2+22+222+2222+22222(此时共有5个数相加)

输入
整数a和n(n个数相加,1<= n, a<=9)

输出
s的值

样例输入
2 2
样例输出
24

题解:本题就是想一下如何得到2 22 222 2222,当然是把前一项乘10加2,然后把得到的数与上一个数累加,将值return回去。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 1e7+5

int f(int a,int n)
{
    int c=a;
    int num=0;
    
    while(n--)
    {
        num+=c;
        c=c*10+a;
    }
    
    return num;
}

int main()
{
    int a,n;
    cin>>a>>n;
    
    cout<<f(a,n)<<endl;
    
    return 0;
}

1011 Problem E [编程入门]最大公约数与最小公倍数

题目描述
输入两个正整数m和n,求其最大公约数和最小公倍数。
输入
两个整数
输出
最大公约数,最小公倍数
样例输入
5 7
样例输出
1 35

题解:最大公约数函数名一般为gcd,最小公倍数一般为lcm,最大公约数算法是:(辗转相除法)用大数对小数取余,然后大数等于小数小数等于余数,继续进入循环,直到余数为零返回大数

想要详细了解辗转相除法,可以在CSDN上面搜索一下。

最小公倍数:其等于两数之积/最大公约数。(a*b)/gcd(a,b);

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 1e7+5

int gcd(int x,int y)
{
    int z;
    
    while(y)
    {
        z=x%y;
        x=y;
        y=z;
    }
    
    return x;
}

int lcm(int a,int b)
{
    return a/gcd(a,b)*b;
}

int main()
{
    int a,b;
    cin>>a>>b;
    
    cout<<gcd(a,b)<<" "<<lcm(a,b);
    
    return 0;
}

1074 Problem F 数字整除

题目描述
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。

例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。

输入
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n1<=n<=10^100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。

输出
对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。

样例输入
34
201
2098765413
1717171717171717171717171717171717171717171717171718
0
样例输出
1
0
1
0

题解一做法超级简单聂少杰大哥创作:

我稍微解释一下:思路一样,都是取两位,直到取到最后,若对17取余等于0,则输出1,否则输出0。str[i]-'0’这个操作可以将char类型转化为int型,实现了可以计算的功能。

最后printf输出,用到了?:条件运算符。?前非零,则执行?后;否则执行:后。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 7654321

int main()
{
    int i,sum;
	char str[105];
	
	while(scanf("%s",str)&&str[0]!='0')
	{
		sum=0;
		for(i=0;str[i]!='\0';i++)
		{
			sum=sum*10+str[i]-'0';
			sum=sum%17;
		}
		printf("%s\n",sum?"0":"1");
	}
	
	return 0;
}

题解二:此题用到了string 构造函数string( string &str, size_type index, size_type length ); 意思是:从str中取,以index为下标开始,截取长度为length结束。
eg: string str;
int index=1,length=5;
string str1(str,index,length);

还有:string类型的c_str()函数,可以将string类型转化为char类型,
eg:string str=“23”;
char a[20]=str.c_str();

还有:atoi()函数,可以将char类型转化为int类型。
eg:int a;
string c=“234”;
char b=‘23’;
a=atoi(b);
或者结合上一个c_str()函数。
a=atoi(c.c_str());

我觉得此题就是模拟一下自己小学的除法过程,从前除到后,直到除完为止除到最后还能被17除尽,则17的倍数,否则不是17的倍数。
因为题目要求n的范围是10的100次方,所以int ,long long 都放不下,so我用了string字符串类型,可以放得下,然后写一个函数模拟一下:

具体过程:用string类型的构造函数截取字符串str从i开始,截取长度为2,然后利用string类型的库函数c_str()将其转化为char类型,在利用atoi()函数将char类型转化为int型进行对17取余。截取完了后,如果其对17取余为0,则继续让i+2,因为你要后移继续运算,如果其对17取余并不等于零,让此时的余数乘以10加上继续往后截取的一位int型直到i取到str字符串类型的长度退出循环

再判断一下最后剩下的数temp能不能被整除能就返回1,否则返回0。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 7654321

void f(string str)
{
    int temp=1,i=0;
    int a,b;
    string strtemp(str,i,2);
    i+=2;
    temp=atoi(strtemp.c_str());
    while(i<str.length())
    {
        if(temp%17==0&&i+2<=str.length())
        {
            string strtemp(str,i,2);
            i+=2;
            temp=atoi(strtemp.c_str());
        }
        else
        {
            string strtemp(str,i,1);
            i+=1;
            a=temp%17;
            b=atoi(strtemp.c_str());
            temp=a*10+b;
        }
    }
    if(temp%17)
        cout<<0<<endl;
    else
        cout<<1<<endl;
}

int main()
{
    string str;

    while(cin>>str&&str[0]!='0')
    {
        f(str);
    }

    return 0;
}

1098 Problem G 陶陶摘苹果

题目描述

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

输入

输入包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

输出

输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

样例输入
100 200 150 140 129 134 167 198 200 111
110
样例输出
5

题解:本题没难度,现将十个数字输入,在输入淘淘高度,只要苹果高度比她加上板凳还高,就够不着,直接在for循环遍历一下谁符合条件,进行num++计数输出即可。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 1e7+5

int main()
{
    int a[10];
    int i,maxm,num=0;
    
    for(i=0;i<10;i++)
    {
        cin>>a[i];
    }
    cin>>maxm;

    for(i=0;i<10;i++)
    {
        if(a[i]<=maxm+30)
        num++;
    }
    
    cout<<num<<endl;
    
    return 0;
}

1099 Problem H 校门外的树

题目描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入

输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

输出

输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

样例输入
500 3
150 300
100 200
470 471
样例输出
298

题解:本题用到标记做法,标记:用于区别对待,这道题可以用0,1标记,有没有修建了地铁,看清楚题目数据范围,定义一个符合长度的数组,建议定义大于一万的数组最好定义到全局变量,main函数由于内存关系,开不了太大,并将其初始化为零,可以像我那样写,也可以直接定义不进行初始化,因为定义到全局变量,其默认数组元素都为零
按题目要求输入,以及三组区段,用两个数组来存储每一个区段的值,然后再用循环将每一组区段都进行遍历,在区段的都标记为1,便于区别,将每组数据都遍历玩一遍后,在遍历一下路总长,将没有被标记的(即为0)的都num++;然后输出num。
注意i的范围0到L的闭区间

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 1e7+5

int a[100000]={0};

int main()
{
    int L,M,i,j,num=0;
    int begin[105],end[105];
    cin>>L>>M;
    
    for(i=0;i<M;i++)
    {
        cin>>begin[i]>>end[i];
    }
    
    i=0;
    
    while(M--)
    {
        for(j=begin[i];j<=end[i];j++)
        {
            a[j]=1;
        }
        
        i++;
    }
    
    for(i=0;i<=L;i++)
    {
        if(a[i]==0)
        num++;
    }
    
    cout<<num<<endl;
    
    return 0;
}

1225 Problem I 文科生的悲哀

题目描述
化学不及格的Matrix67无奈选择了文科。他必须硬着头皮准备一次又一次的文科考试。
在这一学期一共有n次文科考试,考试科目有4种,分别为政治、历史、地理和综合。每次考哪一科是不定的,因此在考试前Matrix67不知道应该 去复习哪一科的功课。他希望能预测出下一次可能考的科目。于是,他收集到了以往的文科考试的资料。从以往的考试中,他发现了这样几个规律
1.如果这次考的是政治,那么下一次一定会考历史;
2.如果这次考的是综合,那么下一次一定会考地理;
3.如果这次考的是历史,那么下一次要么考政治,要么考地理;
4.如果这次考的是地理,那么下一次要么考历史,要么考综合。
Matrix67已经知道,本学期的第一次考试科目为政治。他打算拟定一个可以应对所有可能情况的应考复习计划。因此,他想知道,整个学期有多少种可能的考试科目安排满足以上规律。你能帮他算出来吗?

输入
一个正整数n,代表本学期总的考试次数。(输入数据保证n<=10000)

输出
一个正整数,表示符合规律的科目安排方案的总数。
考虑到这个结果可能会很大,因此你只需要输出它mod 7654321的值即可。

样例输入
5
样例输出
5

题解

总结:1 1 2 3 5斐波那契数列,从n>2开始,每一项等于前两项和

本题可以写成递归函数,就像我注释的地方。但由于调用函数会花费更多的时间,题目输入数据太大运算会相当慢,所以如果超时,建议写到主函数里面。

所以用for循环写,每次加完都让他对7654321取余就行,然后输出此时的值就好。#define mod 7654321这个可以这样写,省下看起来不好看,这样更加直观。。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 7654321

//递归函数解决,提交会显示超时。

//int f(int n)
//{
// if(n==1||n==2)
// return 1;
// return f(n-1)%mod+f(n-2)%mod;
//}
int main()
{
    int a,i;
    ll arr[10005];
    arr[0]=1;
    arr[1]=1;
    scanf("%d",&a);
    //for循环也可以解决
    for(i=2;i<a;i++)
    {
        arr[i]=(arr[i-1]+arr[i-2])%mod;
    }
    
    printf("%d\n",arr[i-1]);
    
    return 0;
}

1270 Problem J P1003

题目描述
为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练 。贝茜希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定: 奶牛独自进山的时间不得超过M秒(1 < = M < = 10,000,000)。 整条山路被贝茜划分成T个长度相同的小段(1 < = T < = 100,000),并且, 贝茜用S_i表示第i个小段的路况。S_i为u,f,d这3个字母之一,它们分别表示 第i个小段是上坡、平地,或是下坡。 贝茜要花U秒(1 < = U < = 100)才能跑完一段上坡路,跑完一段平地的耗时是 F秒(1 < = F < = 100),跑完一段下坡路要花D秒(1 < = D < = 100)。注意,沿山路 原路返回的时候,原本是上坡路的路段变成了下坡路,原本是下坡路的路段变成 了上坡路。 贝茜想知道,在能按时返回农场的前提下,她最多能在这条山路上跑多远。
输入
输入格式: 第1行: 5个用空格隔开的整数:M,T,U,F,以及D * 第2…T+1行: 第i+1行为1个字母S_i,描述了第i段山路的路况
输出
输出格式: 第1行: 输出1个整数,为贝茜在按时回到农场的前提下,最多能跑到多远
样例输入
13 5 3 2 1
u
f
u
d
f
样例输出
3
提示
输入说明: 贝茜跑步的最大耗时为13秒(这么短…),她跑步的山路一共被划成5段。 贝茜跑完一段上坡路的耗时为3秒,平地为2秒,下坡路为1秒。山路各段的走向 如下图所示: _/_ / 输出说明: 贝茜跑完山路的前3段,然后返回,总耗时为3 + 2 + 3 + 1 + 2 + 1 = 12秒,只比她能在外面呆的时限少1秒。如果她跑得更远,就无法按时回到农场。

题解:本题提交都是运行错误,我觉得没有问题,评测系统有问题。然后改了一下,这样竟然通过了,,,,就是把每段路用的时间加起来,去和回相反,也可以直接去加回,一起计算。这道题不好,随便做做就行。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 7654321

int main()
{
    char s;
    int M,T,U,F,D,i;
    int tim=0,k=1;
    
    cin>>M>>T>>U>>F>>D;

    for(i=0;i<T;i++)//5
    {
        cin>>s;
        if(s=='u')
            tim+=U+D;
        if(s=='f')
            tim+=F+F;
        if(s=='d')
            tim+=D+U;
        if(tim>M)
            break;
    }
    cout<<i<<endl;

    return 0;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务