杭电oj(1008、1012、1013、1014、1017)题解
目录
编辑
1008
题目
思路
代码
1012
题目
思路
代码
1013
题目
思路
代码
1014
题目
思路
代码
1017
题目
思路
处理每组测试数据
计算满足条件的整数对数量
代码
1008
题目
思路
s = a[0];
:初始化s
为数组的第一个元素,即电梯从第 0 层上升到第一个楼层的高度。for(int i = 0; i < n - 1; i++)
:遍历数组,比较相邻两个楼层的高度。
if(a[i] > a[i + 1])
:如果当前楼层高于下一个楼层,说明电梯在下降,将下降的高度a[i] - a[i + 1]
累加到x
中。else
:如果当前楼层低于下一个楼层,说明电梯在上升,将上升的高度a[i + 1] - a[i]
累加到s
中。
- 总时间的计算规则如下:
n * 5
:表示电梯在n
个楼层停留的总时间,因为每层停留 5 秒。s * 6
:表示电梯上升的总时间,因为电梯上升每层需要 6 秒。x * 4
:表示电梯下降的总时间,因为电梯下降每层需要 4 秒。- 将这三部分时间相加,得到电梯运行的总时间,并输出结果。
代码
#include<iostream>
using namespace std;
int a[100000];
int main(){int n;while(cin>>n&&n){int s=0;int x=0;for(int i=0;i<n;i++){cin>>a[i];}s=a[0];for(int i=0;i<n-1;i++){if(a[i]>a[i+1]){x+=a[i]-a[i+1];}else{s+=a[i+1]-a[i];}}cout<<n*5+s*6+x*4<<endl;} return 0;
}
1012
题目
思路
- 外层
for
循环从 \(i = 4\) 到 \(i = 9\),表示计算泰勒级数展开式前 5 项到前 10 项的和。- 内层
for
循环从 \(j = 0\) 到 \(j = i\),计算每一项 \(\frac{1}{j!}\) 并累加到sum
中。- 每次外层循环结束后,将
sum
的值存储到数组a
的相应位置。
代码
#include<iostream>
using namespace std;
double a[10]={1,2,2.5,2.666666667,2.708333333};
double jc(int n){if(n<=1) return 1;double sum=1.0;for(int i=1;i<=n;i++){sum*=i;}return sum;
}
int main(){for(int i=4;i<=9;i++){double sum=0;for(int j=0;j<=i;j++){sum+=1/jc(j);}a[i]=sum;}cout<<"n e"<<endl<<"- -----------"<<endl;for(int i=0;i<10;i++){if(i>2) printf("%d %.9lf\n",i,a[i]);else cout<<i<<" "<<a[i]<<endl;}return 0;
}
1013
题目
思路
string s;
:定义一个字符串变量s
,用于存储输入的字符串。while(getline(cin,s)&&s!="0")
:使用getline
函数从标准输入读取一行字符串,只要读取的字符串不为"0"
,就继续处理。a = 0;
:每次处理新的输入时,将全局变量a
初始化为 0。for(int i = 0; i < s.size(); i++){ a += s[i] - '0'; }
:遍历输入字符串s
的每个字符,将字符转换为对应的数字(通过减去字符'0'
的 ASCII 码值)并累加到a
中,得到输入数字的各位数字之和。while(a > 10){ swh(a); }
:如果a
大于 10,说明还需要继续计算各位数字之和,调用swh
函数对a
进行处理,直到a
小于等于 10。if(a == 10) a = 1;
:若最终的a
等于 10,将其修正为 1,因为数字根必须是一位数。cout << a << endl;
:输出最终的数字根。注:要考虑大数
代码
#include<iostream>
#include<string>
using namespace std;
int a;
void swh(int num){int sum=0;while(num>0){sum+=num%10;num/=10;}a=sum;
}
int main(){string s;while(getline(cin,s)&&s!="0"){a=0;for(int i=0;i<s.size();i++){//cout<<a<<endl;a+=s[i]-'0';}while(a>10){swh(a);}if(a==10) a=1;cout<<a<<endl;}return 0;
}
//1013 //没有考虑数据过大
//#include<iostream>
//using namespace std;
//int a;
//void swh(int num){
// int sum=0;
// while(num>0){
// sum+=num%10;
// num/=10;
// }
// a=sum;
//}
//int main(){
// int n;
// while(cin>>n&&n){
// swh(n);
// while(a>9){
// swh(a);
// }
// cout<<a<<endl;
// }
// return 0;
//}
1014
题目
思路
int x, y;
:定义两个long long
类型的变量x
和y
,用于存储用户输入的整数对。while(cin>>x>>y)
:使用while
循环持续读取用户输入的整数对,只要输入有效,就会继续处理。if ( gcd(x, y) == 1)
:调用gcd
函数计算x
和y
的最大公约数,若结果为 1,表明这两个整数互质。
- 若互质,使用
setw(10)
设置输出宽度为 10 个字符,依次输出x
和y
,然后输出" Good Choice"
,并换行两次。else
:若最大公约数不为 1,同样使用setw(10)
设置输出宽度,输出x
和y
,接着输出" Bad Choice"
,并换行两次。
代码
#include<iostream>
#include <iomanip>
#include <sstream>
using namespace std;
#define int long long
int gcd(int a,int b){return b==0?a:gcd(b,a%b);
}
signed main(){int x,y;while(cin>>x>>y){if ( gcd(x, y) == 1) {cout << setw(10) << x << setw(10) << y;cout << " Good Choice" << endl << endl;} else {cout << setw(10) << x << setw(10) << y;cout << " Bad Choice" << endl << endl;}}return 0;
}
1017
题目
思路
处理每组测试数据
while(t--)
:使用while
循环处理t
组测试数据,每次循环t
的值减 1。int n, m;
:定义两个整数变量n
和m
,用于存储输入的整数对。int k = 1;
:定义一个整数变量k
,用于记录当前测试用例的编号,初始值为 1。while(cin>>n>>m)
:使用while
循环不断读取整数对(n, m)
,直到遇到n
和m
都为 0 的情况。if(n==0 && m==0) break;
:如果输入的n
和m
都为 0,则跳出内层while
循环,结束当前组测试数据的处理。if(t) cout<<endl;
:如果还有剩余的测试数据(即t
不为 0),则输出一个空行,用于分隔不同组的测试数据。计算满足条件的整数对数量
int count = 0;
:定义一个整数变量count
,用于记录满足条件的整数对数量,初始值为 0。for(int i = 1; i < n; i++)
:外层循环遍历i
从 1 到n - 1
。for(int j = i + 1; j < n; j++)
:内层循环遍历j
从i + 1
到n - 1
,确保j > i
。double x = 1.0 * (i * i + j * j + m) / (i * j);
:计算(i² + j² + m) / (i * j)
的值,并将结果存储在x
中。if(x == (int)x)
:判断x
是否为整数,如果是整数,则count
加 1。
代码
#include<iostream>
using namespace std;
int main(){int t;cin>>t;while(t--){int n,m;int k=1;while(cin>>n>>m){if(n==0 && m==0) break;int count=0;for(int i=1;i<n;i++){for(int j=i+1;j<n;j++){double x=1.0*(i*i+j*j+m)/(i*j);if(x==(int)x){count++; }}}printf("Case %d: %d\n",k++,count);}if(t) cout<<endl;}return 0;
}