目 录
1.L1-001 Hello World
2.L1-002 打印沙漏
3.L1-003 个位数统计
4.L1-004 计算摄氏温度
5.L1-005 考试座位号
6.L1-006 连续因子
7.L1-007 念数字
8.L1-008 求整数段和
9.L1-009 N个数求和
10.L1-010 比较大小
1.L1-001 Hello World
代码:
#include<stdio.h>
int main()
{printf("Hello World!");return 0;
}
2.L1-002 打印沙漏
分析:
这题考一点数学归纳的能力,规律总结如下:
我们发现沙漏需要符号的数量为1+3*2+5*2 ......
所以我们得到总的符号数量,可以用循环得出当前这些符号能凑几层沙漏
然后写一个循环打印上层,自增或者自减以下循环变量,然后用这个循环变量再归零打印下层即可
代码:
#include<iostream>using namespace std;
#define endl "\n"
int n;
char s;int main() {cin>>n>>s;
// int n=1;int sum=1;int i,j,k;for( i=3;;i+=2){if (sum+i*2>n) break;sum+=i*2;} i--;int lay=(i+1)/2;
// 上半部分 for (j=lay;j>=1;j--){for( k=0;k<lay-j;k++){cout<<" ";} for(k=1;k<=j*2-1;k++){cout<<s;}cout<<endl;}
// 下半部分for (j=2;j<=lay;j++){for( k=0;k<lay-j;k++){cout<<" ";} for(k=1;k<=j*2-1;k++){cout<<s;}cout<<endl;} cout<<n-sum;return 0;
}
3.L1-003 个位数统计
分析:
这个题目说(1000位的正整数),按照十进制来表达,正常的数值型数据是处理不了这个数字的
所以我们需要使用【流处理】的思想,使用字符串读取,然后一个一个遍历,边读边使用一种数据结构统计结果,最后按照要求输出该数据结构的信息即可!
代码:
#include<iostream>using namespace std;string str;
int arr[11];
signed main(){cin>>str;for(int i=0;i<str.size();i++){arr[str[i]-'0']++;} for(int i=0;i<=9;i++){if (!arr[i]) continue;cout<<i<<":"<<arr[i]<<endl;}return 0;
}
4.L1-004 计算摄氏温度
这个就是将公式转换为代码,不是很难
代码:
#include<iostream>using namespace std;int f;signed main(){cin>>f;cout<<"Celsius = "<<5*(f-32)/9; return 0;
}
5.L1-005 考试座位号
分析:
这道题,从特征上来看(一行记录有多种属性,大于等于2),所以我们一定要用到结构体来存储信息。
这题要求是根据试机座位号,来查询自己的其他字段的信息,所以我们需要用到结构体排序
然后按照结构体的试机座位号为权重来进行从小到大的排序,然后排序好之后我们直接使用给出的编号就可以以O(1)的方式进行查询了
代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define int int long longint n,m;
int nums;
struct sss {int admissionNumber;int tryNumber;int formalNumber;
};struct sss ttt[1010];
bool cmp(struct sss a,struct sss b){return a.tryNumber<b.tryNumber;
}
signed main(){cin>>n;for(int i=0;i<n;i++){cin>>ttt[i].admissionNumber>>ttt[i].tryNumber>>ttt[i].formalNumber;}cin>>m;sort(ttt,ttt+n,cmp);for(int i=0;i<m;i++){cin>>nums;cout<<ttt[nums-1].admissionNumber<<" "<<ttt[nums-1].formalNumber<<endl;}return 0;
}
6.L1-006 连续因子
分析:
这道题题目意思稍微有点不太直观,大意如下:
许多因子相乘组成一个数,你要找出这个数的最长连续(相邻值差1)的因子
然后这里面有一个技巧:一个数n的因子到sqrt(n)就已经终止了,我们枚举到这里即可
所以这道题直接暴力枚举就可以了,中间记得记录长度!
代码:
#include<iostream>
#include<cmath>
using namespace std;#define int int long long// 这道题的思路本质是暴力枚举
//实质上也需要懂得剪枝去进行枚举
//譬如说 某个数的因子 那么一定就在[2,sqrt(n)]之间
int n;// 记录答案
int start=0;
int nums=0;signed main(){cin>>n;for(int i=2;i<=sqrt(n);i++){int currentNum=i;int temp=n;int cnt=0;while(temp%currentNum==0){temp/=currentNum;currentNum++;cnt++;} if (cnt>nums){start=i;nums=cnt;}}if (nums==0){cout<<1<<endl<<n;}else {cout<<nums<<endl;for(int i=start;i<start+nums;i++){if (i-start) cout<<"*"; cout<<i;} }return 0;
}
7.L1-007 念数字
分析:
题目的意思很好理解:将数字转换为拼音输出。
我的思路是读取数字为字符串,先检查是否数值为负,是的话输出一个fu
然后构建一个数字到拼音的映射字典,遍历这个字符串,直接输出映射的内容。
中间记得进行格式控制
tips:还可以使用个位数取余+栈+字典的方法做.
代码:
#include<iostream>
#include<map>
#include<algorithm>
#include<string>
#include<string.h>using namespace std;
map<int,string> mymap;string nums;
int startIndex=0;
bool flag=false;
void init() {mymap[0]="ling";mymap[1]="yi";mymap[2]="er";mymap[3]="san";mymap[4]="si";mymap[5]="wu";mymap[6]="liu";mymap[7]="qi";mymap[8]="ba";mymap[9]="jiu";}
signed main() {cin>>nums;init();
// cout<<stoi(nums)<<endl;
// c++11标准 if (stoi(nums)<0) {cout<<"fu";flag=true;startIndex++;}
// cout<<startIndex<<" "<<nums.length()<<endl;for (int j=startIndex;j<nums.length();j++){if (j-startIndex || flag) cout<<" ";
// cout<<nums[j]-'0'<<" "<<mymap[nums[j]-'0']<<"...."<<endl;cout<<mymap[nums[j]-'0'];}return 0;
}
8.L1-008 求整数段和
分析:
这道题目就是考察对printf格式化输出。我们会使用占位符的语法即可
中间记得控制格式!
代码:
#include<iostream>
#include<cstdio>
using namespace std;int lefts,rights;
int coun=0,sum=0;
int i;
signed main() {cin>>lefts>>rights;for ( i=lefts;i<=rights;i++){printf("%5d",i);coun++;if (coun%5==0) cout<<"\n";sum+=i;}if (coun%5!=0) cout<<endl;cout<<"Sum = "<<sum<<endl;return 0;
}
9.L1-009 N个数求和
分析:
我们知道两个数字相加得到结果是需要通分的,我们用代码实现也可以参考这个过程!
这道题一个比较好的思路如下:
(1)在录入的时候求分母的最小公倍数。
(2)再遍历一遍分子,将分子乘以 最小公倍数对当前分母的倍数
(3)最后将分子加起来,和最小公倍数作比 进行化简
(4)写判断考虑各种题目强调的情况
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define int long long int
#define debug(a) cout<<#a<<"="<<a<<endl;int n;
int fz=0,fm=1;int fzs[110],fms[110];
// 存储整数部分
int sum=0;
signed main() {cin>>n;// 这个循环顺便求fm的最小公倍数 for (int i=0;i<n;i++){scanf("%lld/%lld",&fzs[i],&fms[i]);fm=fm*fms[i]/__gcd(fm,fms[i]);}// 这里获取通分分子for(int i=0;i<n;i++){fz+=fm/fms[i]*fzs[i];} // int nums=__gcd(fz,fm);fz/=nums;fm/=nums;if (fz%fm==0) {cout<<fz/fm;}else if (fz>fm) {cout<<fz/fm<<" "<<fz%fm<<"/"<<fm<<endl;}else {cout<<fz%fm<<"/"<<fm<<endl;}return 0;
}
10.L1-010 比较大小
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int arr[10];signed main() {for(int i=0;i<3;i++){cin>>arr[i];}sort(arr,arr+3);for(int i=0;i<3;i++){if (i) cout<<"->";cout<<arr[i];}return 0;
}