:小兰想为一条街的居民制作门牌号。 这条街一共有 2020 住户,门牌号从 1 到 2020 编号。 小蓝制作门牌的方法是先制作门牌 0 到 9 这些数字据需要将这些数字字符粘贴在门牌上,如门牌 1017 要依次粘贴字符 1、 0、 1、 7,即需要 1 个字符 0, 2 个字符 1, 1 个字符 7.我想做一切 1 到 2020 号门牌需要多少个字符? 2? :这是一个填空结果的问题。你只需要计算结果并提交它。这个问题的结果是一个整数。提交答案时只填写整数,填写多余内容不会得分。
# include <iostream> using namespace std; int num_of_two(int n){
int sum = 0; while(n!=0){
int tmp = n%10; if(tmp==2) sum ; n /= 10; } return sum; } int main(){
int sum = 0; for(int i=1;i<=2020;i ) sum = num_of_two(i); cout<<sum; return 0; }
:624
:如果一个分子和分母的最大公约数是 1,这个分数称为既约分数。 例如,34 , 52 , 18 , 71 都是既约分数。 请问有多少既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)? :这是一个填空结果的问题。你只需要计算结果并提交它。这个问题的结果是一个整数。提交答案时只填写整数,填写多余内容不会得分。
# include <iostream> using namespace std; ///最大公约数是否为1 bool divide(int a,int b){
int c;
while(b!=0){
c = a%b;
a = b;
b = c;
if(b==0) break;
}
return a==1?true:false;
}
int main(){
int sum = 0;
for(int i=1;i<=2020;i++)
for(int j=1;j<=2020;j++)
if(divide(i,j)) sum++;
cout<<sum;
return 0;
}
:2481215
:如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。 1 2 6 7 15 … 3 5 8 14 … 4 9 13 … 10 12 … … 容易看出矩阵第二行第二列中的数是5。请计算出矩阵第20行第20列的数是多少? :这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
# include <iostream>
using namespace std;
int main(){
int gap = 0;
int num = 1;
int n = 20;
while(n--){
num += gap;
gap += 4;
}
cout<<num;
return 0;
}
:761
:上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二 极管,分别标记为 a, b, c, d, e, f, g。 小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。 例如:b 发光,其他二极管不发光可以用来表达一种字符。 例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。 例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。 例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。请问,小蓝可以用七段码数码管表达多少种不同的字符? :这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 :用深度优先遍历枚举每一种可能,然后检测是否可行,注意检测是否可行时的条件,很容易算错。
# include <iostream>
# include <vector>
# include <fstream>
using namespace std;
int arr[7] = {
0,1,2,3,4,5,6};//并查集数组
bool vis[7];//访问数组
vector<vector<int>> vec;//存储每一种排列
vector<int> v;//单个排列
int graph[7][7];//存储可达矩阵
int sum = 0;//种类数
void dfs(int idx){
if(vis[idx]) return ;
vis[idx] = true;
v.push_back(idx);
vec.push_back(v);//加入队列
for(int i=idx+1;i<7;i++)
dfs(i);
v.pop_back();//删除最后一个元素
vis[idx] = false;
}
void check(vector<int> vt){
if(vt.size()==1){
sum++;return ;
}
for(int i=0;i<7;i++) arr[i] = i;
for(int i=0;i<vt.size();i++) {
for (int j = 0; j < vt.size(); j++)
if (graph[vt[i]][vt[j]] == 1) {
/*----------注意这里的处理,很容易算错----------*/
int tmp = arr[vt[j]];
for (int k = 0; k < vt.size(); k++)
if (arr[vt[k]] == tmp)
arr[vt[k]] = arr[vt[i]];
/*----------注意这里的处理,很容易算错----------*/
}
}
for(int i=1;i<vt.size();i++)
if(arr[vt[i]]!=arr[vt[i-1]]) return ;
sum++;
}
int main(){
//读入文件
fstream in("./number.txt");
//可达矩阵
for(int i=0;i<7;i++)
for(int j=0;j<7;j++)
in>>graph[i][j];
//深度优先遍历 => 得出所有排列情况
for(int i=0;i<7;i++)
dfs(i);
//将所有排列检测是否存在不连续的段
for(int i=0;i<vec.size();i++)
check(vec[i]);
//输出结果
cout<<sum;
return 0;
}
1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1
:80
:平面上有N条直线,其中第i条直线是y = Ai*x+Bi。 请计算这些直线将平面分成了几个部分。 :第一行包含一个整数N。以下N行,每行包含两个整数Ai,Bi。 :一个整数代表答案。 : 3 1 1 2 2 3 3 : 6 : 对于50%的评测用例,1≤N≤4,-10≤Ai,Bi≤10。 对于所有评测用例,1≤N≤1000,-100000≤Ai,Bi≤100000。
# include <iostream>
# include <set>
using namespace std;
int main(){
int n,sum = 1;
cin>>n;
pair<int,int> pi,pj;//斜率和截距
pair<double,double> pt;//交点坐标
set<pair<int,int> > s;
int k,b;
for(int i=0;i<n;i++){
cin>>k>>b;
s.insert(pair<int,int>(k,b));
}
set<pair<int,int> >::iterator i,j;
for(i=s.begin();i!=s.end();i++){
set<pair<double,double> > ctr;
for(j=s.begin();j!=i;j++){
pi = *i,pj = *j;
if(pi.first==pj.first) continue;//平行
else{
pt.first = 1.0*(pj.second-pi.second)/(pi.first-pj.first);//交点横坐标
pt.second = pt.first*pi.first + pi.second;//交点纵坐标
ctr.insert(pt);//记录交点
}
}
if(ctr.size()==0) sum++;
else sum += (ctr.size()+1);
}
cout<<sum;
return 0;
}
:小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。 请计算这次考试的最高分、最低分和平均分。 :输入的第一行包含一个整数 n,表示考试人数。 接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。 :输出三行。 第一行包含一个整数,表示最高分。 第二行包含一个整数,表示最低分。 第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。 : 7 80 92 56 74 88 99 10 : 99 10 71.29 : 对于 50% 的评测用例,1 ≤ n ≤ 100。 对于所有评测用例,1 ≤ n ≤ 10000。
# include <iostream>
# include <iomanip>
using namespace std;
int main(){
int n;
int maxn = 0,minn = 100,score = 0;
float avgn = 0;
cin>>n;
for(int i=0;i<n;i++){
cin>>score;
if(maxn<score) maxn = score;
if(minn>score) minn = score;
avgn += score;
}
cout<<maxn<<endl<<minn<<endl<<setiosflags(ios::fixed)<<setprecision(2)<<(avgn*1.0/n);
return 0;
}
: 2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按 yyyymmdd 的格式写成一个8位数是 ,恰好是一个回文数。我们称这样的日期是回文日期。 有人表示 20200202是“千年一遇”的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期: 20211202 即2021年12月2日。 也有人表示 20200202并不仅仅是一个回文日期,还是一个 ABABBABA型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA型的回文日期: 21211212即2121年12月12日。算不上“千年一遇”,顶多算“千年两遇”。 给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。 :输入包含一个八位整数N,表示日期。 :输出两行,每行1个八位数。第一行表示下一个回文日期,第二行表示下一个ABABBABA型的回文日期。 : 20200202 : 20211202 21211212 : 对于所有评测用例,10000101≤N≤89991231, 保证N是一个合法日期的 8 位数表示。
以下代码只通过90%测试用例,大家可以帮我看看有哪些缺陷。
# include <iostream>
# include <string>
using namespace std;
//字符串转数字
int toInt(string str,int begin,int end){
int num = 0;
int bits = 1;
for(int i=end;i>=begin;i--){
num += (str[i]-48)*bits;
bits *= 10;
}
return num;
}
//翻转字符串
string reverse(string str){
int len = str.length();
int mid = len>>2;
for(int i=0;i<=mid;i++){
char tmp = str[i];
str[i] = str[len-i-1];
str[len-i-1] = tmp;
}
return str;
}
//数字转字符串
string toStr(int num,int bits){
string str = "";
while(num!=0){
int bit = num%10;
str += (char)(bit+48);
num /= 10;
bits--;
}
while(bits--)
str += '0';
str = reverse(str);
return str;
}
int main(){
string date1;
cin>>date1;
int y1 = toInt(date1,0,3),m1 = toInt(date1,4,5),d1 = toInt(date1,6,7);
string str1,str2;
bool f1 = false,f2 = false;
for(int i=y1+1;;i++){
string str = toStr(i,4);
str += reverse(str);//必定是回文的日期
int year = toInt(str,0,3);
int month = toInt(str,4,5);
int day = toInt(str,6,7);
//不符合要求的日期筛选掉
if((year==y1 && month<m1) || (year==y1 && month==m1 && day<d1)) continue;
if(month<1 || month>12 || day<1) continue;
if((month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) && day>31) continue;
if((month==4 || month==6 || month==9 || month==11) && day>30) continue;
if(month==2){
if(((year%4==0 && year%100!=0)|| year%400==0) && day>29) continue;
else if(day>28) continue;
}
//当前必定为回文日期
if(!f1){
f1 = true;str1 = str;
}
//检测是否为ABABBABA型
if(!f2 && str[0]==str[2] && str[2]==str[5] && str[5]==str[7]
&& str[1]==str[3] && str[3]==str[4] && str[4]==str[6] && str[4]!=str[7]