OpenJudge NOI 1.5 编程基础之循环控制(21-30题)C++ 解题思路

续上一篇文章OpenJudge NOI 1.5编程基础之循环控制(11-20题) C++ 解题思路_Leleprogrammer的博客-CSDN博客续上一篇文章。https://blog.csdn.net/leleprogrammer/article/details/127157621?spm=1001.2014.3001.5501

目录

21 角谷猜想

22 津津的储蓄计划

23 药房管理

24 正常血压

25 求特殊自然数

26 统计满足条件的4位数个数

27 级数求和

28 分离整数的各个数位

29 数字反转

30 含k个3的数


21 角谷猜想

#include <iostream>
using namespace std;

int main() {
	long long n;
	cin>>n;
	while (true) {
		if (n==1) {
			cout<<"End";
			break;
		}
		if (n%2==1) {
			cout<<n<<"*3+1="<<n*3+1;
			n=n*3+1;
		} else {
			cout<<n<<"/2="<<n/2;
			n/=2;
		}
		cout<<endl;
	}
	return 0;
}

根据提示,计算过程中中间值会超过int的范围,所以n采用long long类型,如果用int的话会WA(Wrong Answer) 

22 津津的储蓄计划

#include <iostream>
using namespace std;

int main() {
	int money=0;
	int nowHave=0;
	for (int i=1;i<=12;++i) {
		int get;
		cin>>get;
		nowHave+=300;
		if (nowHave<get) {
			cout<<-i;
			return 0;
		}
		nowHave-=get;
		money+=nowHave/100*100;
		nowHave=nowHave-nowHave/100*100;
	}
	double result=nowHave+money*1.2;
	cout<<result;
	return 0;
}

遍历12次,表示12个月,再对钱不够用的情况、剩余钱、存钱等操作的执行 

23 药房管理

#include <iostream>
using namespace std;

int main() {
	int m,n,no=0;
	cin>>m>>n;
	for (int i=1;i<=n;++i) {
		int get;
		cin>>get;
		if (m-get<0) {
			no++;
		} else {
			m-=get;
		}
	}
	cout<<no;
	return 0;
}

采用循环,只要药不足就+1,最后输出结果即可 

24 正常血压

#include <iostream>
using namespace std;

int main() {
	int n;
	cin>>n;
	int normal=0,maxNormal=0;
	for (int i=1;i<=n;++i) {
		int a,b;
		cin>>a>>b;
		if (a>=90&&a<=140&&b>=60&&b<=90) {
			normal++;
			if (normal>maxNormal) {
				maxNormal=normal;
			}
		} else {
			normal=0;
		}
	}
	cout<<maxNormal;
	return 0;
}

不断获取cin输入,然后进行判断就好了 

25 求特殊自然数

#include <iostream>
using namespace std;

int main() {
	for (int i=100;i<=999;++i) {
		int a=i/100;
		int b=i%100/10;
		int c=i%100%10;
		if (a>=7||b>=7||c>=7) continue;
		if (a*7*7+b*7+c==c*9*9+b*9+a) {
			cout<<a*7*7+b*7+c<<endl;
			cout<<a<<b<<c<<endl;
			cout<<c<<b<<a;
			return 0;
		}
	}
	return 0;
}

因为7进制和9进制都是3位数,所以遍历100到999之间的数字,由于7进制数位中不可能出现≥7的数,9进制中不可能出现9,所以只要数字里包含7 8 9就跳过,剩下的计算出对应的十进制数,进行比较就好了!

26 统计满足条件的4位数个数

#include <iostream>
using namespace std;

int main() {
	int n,result=0;
	cin>>n;
	for (int i=1;i<=n;++i) {
		int get;
		cin>>get;
		int a=get/1000;
		int b=get%1000/100;
		int c=get%1000%100/10;
		int d=get%1000%100%10;
		if (d-a-b-c>0) {
			result++;
		}
	}
	cout<<result;
	return 0;
}

通过取余和整除的操作获得数位,然后进行计算和判断就ok了 

27 级数求和

#include <iostream>
using namespace std;

int main() {
	int k,n=1;
	cin>>k;
	double result=0.0;
	while (true) {
		result+=1.0/n;
		if (result>k) break;
		n++;
	}
	cout<<n;
	return 0;
}

注意这道题进行除法时要用1.0去除,这样才能得出浮点数 

28 分离整数的各个数位

#include <iostream>
using namespace std;

int main() {
	int n;
	cin>>n;
	while (true) {
		cout<<n%10<<" ";
		n/=10;
		if (n==0) break;
	}
	return 0;
}

原数%10得出最低位数字,原数/10去除最低位 

29 数字反转

#include <iostream>
using namespace std;

int main() {
	int n;
	cin>>n;
	if (n<0) {
		cout<<"-";
		n=-n;
	}
	bool first=true;
	while (true) {
		int w=n%10;
		n/=10;
		if (w==0&&first==false) {
			cout<<w;
		}
		else if (w!=0) {
			cout<<w;
			first=false;
		}
		if (n==0) {
			break;
		}
	}
	return 0;
}

 有负号先输出负号,得出绝对值后再进行数位分解的操作

30 含k个3的数

#include <iostream>
using namespace std;

int main() {
	int m,k,c=0;
	cin>>m>>k;
	if (m%19==0) {
		while (true) {
			int w=m%10;
			if (w==3) {
				c++;
			}
			m/=10;
			if (m==0) {
				break;
			}
		}
		if (k==c) {
			cout<<"YES";
		} else {
			cout<<"NO";
		}
	} else {
		cout<<"NO";
	}
	return 0;
}

 仍然用到了分离数位的操作

猜你喜欢

转载自blog.csdn.net/leleprogrammer/article/details/127164184