水一篇博客。
1. 三个数的和、积与平均值
值得注意的有两点:
- 防止溢出
- fixed会使此行后的所有行都固定输出位数。
- 解决方法:
- double储存。其实这题似乎没有考虑到这个问题。
- 输出位数在前两个可以用强制转换为int来防止输出多位。
- 或者直接在每一行都加入一句setprecision();不需要的填入0,需要的填入需要保留的位数。
- 四舍五入:原数* 1 0 需 要 保 留 的 位 数 10^{需要保留的位数} 10需要保留的位数+0.5再转换为int去尾。最后再除以 1 0 需 要 保 留 的 位 数 10^{需要保留的位数} 10需要保留的位数还原。
#include <bits/stdc++.h>
using namespace std;
int main()
{
double a,b,c;
while(cin>>a>>b>>c){
//和、乘积、平均数
cout<<(int)(a+b+c)<<" ";
cout<<(int)(a*b*c)<<" ";
double temp = (a+b+c)/3.0;
temp=(int)(temp*100+0.5);
cout<<fixed<<setprecision(2)<<(temp/100)<<endl;
}
return 0;
}
2. 计算器
问题描述 :
请编程实现一个简单的计算器,支持+,-,*,/四种运算。只考虑输入为整数和0的情况。
(1)如果出现除数为0的情况,则输出:“zero”
(2)如果出现无效的操作符(即不为+,-,*,/之一),则输出:“error”(不包含双引号)
(3)如果能正常计算,则输出计算结果。如果是除法,保留两位小数,如果是其它运算,则输出一个整数。
正常条件判断皆可。
值得注意的是四舍五入的时候,正数+0.5;负数-0.5.
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
char c;
while(cin>>a>>b>>c){
if(c!='+'&&c!='-'&&c!='/'&&c!='*'){
cout<<"error"<<endl;
}
else if(b==0&&c=='/'){
cout<<"zero"<<endl;
}
else{
if(c=='+'){
cout<<(int)(a+b)<<endl;
}
else if(c=='-'){
cout<<(int)(a-b)<<endl;
}
else if(c=='*'){
cout<<(int)(a*b)<<endl;
}
else{
double temp = (a*1.0)/(b*1.0);
if(temp<0)temp=(int)(temp*100-0.5);
else temp=(int)(temp*100+0.5);
cout<<fixed<<setprecision(2)<<(temp/100)<<endl;
}
}
}
return 0;
}
- 计数问题
额,挺简单的。用一个数组的下标来用作需要查找的数,数组元素值对应该下标出现的次数。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
int c[10]={0};
cin>>a>>b;
for(int i=1;i<=a;i++){
int temp = i;
while(temp){
c[temp%10]++;
temp/=10;
}
}
cout<<c[b];
return 0;
}
- 数组求和
这题我CE就离谱。好像CB每一个变量都需要赋初值否则会出错。太久没用了。
注意:动态规划,每次只需要找到局部最优解就行了。
这种成环问题在遍历的时候可以通过取模(%)的方式来达到循环读每个数组元素的效果。
下面是我回来后刚写的,仅供参考。
#include <iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int nums[1001]={0};
for(int i=0;i<n;i++){
cin>>nums[i];
}
int M=0;
for(int i=0;i<m;i++){
cout<<nums[i]<<endl;
M+=nums[i];
}
int temp =0;
for(int i=0;i<n;i++){
for(int j=i,s=0;s<m;s++,j++){
temp+=nums[j%n];
}
if(temp>M){
M=temp;
}
temp = 0;
}
cout<<M<<endl;
return 0;
}