近期做题遇到的小问题与小套路

1.实数,整型一定要记得区分

a=1/b

a=1.0/b

二者一个是0一个是小数(实数);

当结果输出的是小数时,一定要记得将数据化为实型!

2.如何逐个输入二维数组

题目描述

已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。
现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。

所以在设计程序1/n过程中,要记得1.0/n,否则程序错误!!!!!!

for(b=1;b<6;b++)
{for(c=1;c<6;c++)
 scanf("%d",&a[b][c]);}

3.十进制--->二进制。

运用函数递归;


 
long long f(int a) {
if(a<2)return a;
return f(a/2)*10+a%2;
}

4.swap函数,交换值
swap函数变量的数据类型必须相同。

5.M x N矩阵的正方形,矩形,长方形的个数

小学奥数白学了.....

正方形个数:

边长为1 个数n*m

边长为2 个数(n-1)*(m-1)

边长为3 个数(n-2)*(m-2)

所以 边长为min{n,m} 个数(m-min{n,m}+1)*(n-min{n,m}+1)

长方形加正方形个数(矩形的个数):

total=(1+2+3+…+n)*(1+2+3+…+m)

=((1+n)*(1+m)*n*m)/4

长方形个数(不包括正方形的话)(正方形是特殊的长方形)

上面两式相减即可得出。

代码如下:

#include<iostream>
using namespace std;
long long n,m,a,b,c,d;
int main()
{
    cin>>n>>m;    
    a=m;b=n;c=m*n;
    while(a!=0&&b!=0){
        a--;b--;c+=a*b;
    }
    d=(m+1)*(n+1)*m*n/4-c;
    cout<<c<<" "<<d;
}

6.输出各个数位之和,如果是个位数,输出,如果不是,继续数位和,直到结果是个位数为止。

若不考虑递归循环做法。

int f(int n)

if(n<9)return n;

int sum=0;

while(n!=0){

n=n%10;

sum+=n;

n=n/10;

}

return f(sum);

简便算法:sum=(n-1)%9+1(推导看教程)

7.时间题基本小套路

跟小时分钟秒有关的题,要想到全部转换成秒数的思路

小时*3600 分钟*60
 

ACM竞赛中,当遇到有两个队伍(人) 解出相同的题目数量的时候,我们需要通过他们解决问题的总时间进行排序。

一共有 N(1<=N<=5,000)条时间被以时(0<=Hours<=99), 分(0<=Minutes<=59),秒(0<=Seconds<=59)的形式记录。

你必须要把他们按时,分,秒排序为 升序,最少的时间最先。 考虑到如下的样例,这三个解出相同题目数量的时间为

11:20:20

11:15:12

14:20:14

正确的排序结果应该是这样的:

11:15:12

11:20:20

14:20:14

输入描述:

第 1 行,一个整数 N 第 2~n+1 行,每行 3 个整数,表示时,分,秒

输出描述:

共 n 行,每行 3 个整数,表示排序完后的结果

示例1

输入

复制3 11 20 20 11 15 12 14 20 14

3 
11 20 20
11 15 12
14 20 14

输出

复制11 15 12 11 20 20 14 20 14

11 15 12 
11 20 20 
14 20 14
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[5050];
	int x,y,z,n;
	cin>>n;
	for(int i=0;i<n;i++){
			cin>>x>>y>>z;
			a[i]=3600*x+60*y+z;
	}
	sort(a,a+n);
	for(int i=0;i<n;i++){
			cout<<a[i]/3600<<" "<<(a[i]%3600)/60<<" "<<a[i]%60<<endl;
	}
} 

8.find函数 和 tolower toupper函数 的应用.

见题:

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章
中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )

输入描述:

共 2 行。
第 1 行为一个字符串,其中只含字母,表示给定单词;
第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章

输出描述:

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数 -1。

代码实现如下:

#include<bits/stdc++.h>
using namespace std;

int main()
{    int b,ans=0;
     string a;
     string s;
    getline(cin,a);
    getline(cin,s);
 
    for (int i=0;i<a.length();i++){
    a[i]=tolower(a[i]);
    }
 
    for(int i = 0;i < s.length();i++){
    s[i] = tolower(s[i]);
    } 
 
    a=' '+a+' ';
    s=' '+s+' ';
 
    while(s.find(a,b)!=-1){
        b=s.find(a,b)+a.length()-1;
        ans++;
    }
 
  cout<<ans<<' '<<s.find(a);
}

可见tolower函数,将字符串a与字符串s统一转换成小写形式

find函数 是在s字符串中找到字符串a第一次出现的位置,

若找不到,则输出-1。

9.C语言中 abs、cabs、labs和fbs的区别
一)abs
C语言 abs() 函数用于求整数的绝对值。
头文件:math.h 或者 stdlib.h
语法/原型:int abs(int n);
n 表示要求绝对值的数。
返回值:参数 n 的绝对值。


二)cabs
C语言 cabs() 函数用于求字符的绝对值。
头文件:math.h 或者 stdlib.h
语法/原型:char cabs(char n);
n 表示要求绝对值的数。
返回值:参数 n 的绝对值。


三)labs
C语言 labs() 函数用于求长整新的绝对值。
头文件:math.h 或者 stdlib.h
语法/原型:long cabs(long n);
n 表示要求绝对值的数。
返回值:参数 n 的绝对值。


四)fabs
C语言 fabs() 函数用于求双精度浮点数的绝对值。
头文件:math.h
语法/原型:
double fabs(double x);
参数 x 是求绝对值的数。
返回值:参数 x 的绝对值。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值