蓝桥等考-中级-while循环结构-练习
蓝桥等考-中级-while循环结构-练习
OpenJudge-1.5-21 角谷猜想
描述
所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。如,假定初始整数为5,计算过程分别为16、8、4、2、1。
程序要求输入一个整数,将经过处理得到1的过程输出来。
输入
一个正整数N(N <= 2,000,000)
输出
从输入整数到1的步骤,每一步为一行,每一部中描述计算过程。最后一行输出"End"。如果输入为1,直接输出"End"。
样例输入
5
样例输出
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End
提示
注意计算过程中中间值可能会超过int范围。
解题思路
参考程序
#include<bits/stdc++.h>
using namespace std;
long long n;
int main(){
cin>>n;
while(n!=1){
long long temp = n;
if(n%2==0){
n/=2;
cout<<temp<<"/"<<2<<"="<<n<<endl;
}else{
n=3*n+1;
cout<<temp<<"*"<<3<<"+"<<1<<"="<<n<<endl;
}
}
cout<<"End";
}
OpenJudge-1.5-28 分离整数的各个数位
描述
给定一个整数,要求从个位开始分离出它的每一位数字。
输入
输入一个整数,整数在1到100000000之间。
输出
从个位开始按照从低位到高位的顺序依次输出每一位数字。数字之间以一个空格分开。
样例输入
123
样例输出
3 2 1
解题思路
参考程序
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,b,c;
cin>>n;
while(n!=0){
cout<<n%10<<" ";
n=n/10;
}
cout<<endl;
}
OpenJudge-1.5-29 数字反转
描述
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。
输入
输入共 1 行,一个整数N。
-1,000,000,000 ≤ N≤ 1,000,000,000。
输出
输出共 1 行,一个整数,表示反转后的新数。
样例输入
样例 #1:
123
样例 #2:
-380
样例输出
样例 #1:
321
样例 #2:
-83
解题思路
参考程序
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,s=0;
scanf("%d",&n);
if(n<0) printf("-");
n=abs(n);
if(n==0){
printf("0");
return 0;
}
while(n!=0){
s=s*10+n%10;
n/=10;
}
printf("%d\n",s);
return 0;
}
OpenJudge-1.5-30 含 k 个 3 的数
描述
输入两个正整数 m 和 k,其中1 < m < 100000,1 < k < 5 ,判断 m 能否被19整除,且恰好含有k个3,如果满足条件,则输出YES,否则,输出NO。
例如,输入:
43833 3
满足条件,输出YES。
如果输入:
39331 3
尽管有3个3,但不能被19整除,也不满足条件,应输出NO。
输入
m 和 k 的值,中间用单个空格间隔。
输出
满足条件时输出 YES,不满足时输出 NO。
样例输入
43833 3
样例输出
YES
解题思路
参考程序
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n,k,s=0,t;
cin>>m>>k;
n=m;
while(n!=0){
t=n%10;
if(t==3){
s++;
}
n/=10;
}
if(m%19==0 && s==k){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
return 0;
}
OpenJudge-1.5-45 金币
描述
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里,每天收到三枚金币;之后四天(第七、八、九、十天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币(N为任意正整数)。
你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。
输入
一个整数(范围1到10000),表示天数。
输出
骑士获得的金币数。
样例输入
6
样例输出
14
解题思路
参考程序
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, sum = 0, d = 0, i = 1;//sum:获得的总金币 d:阶段数 i:天数
cin>>n;
while(i <= n)//每次while循环,发放一个阶段的金币
{
d++;
for(int j = 1; j <= d; j++)
{
sum += d;
i++;
if (i > n)
break;
}
}
cout<<sum;
return 0;
}
洛谷 1035 级数求和
题目描述
已知:\(S_n= 1+\frac{1}{2}+\frac{1}{3}+…+\frac{1}{n}\)。显然对于任意一个整数 \(k\),当 \(n\) 足够大的时候,\(S_n>k\)。
现给出一个整数 \(k\),要求计算出一个最小的 \(n\),使得 \(S_n>k\)。
输入格式
一个正整数 \(k\)。
输出格式
一个正整数 \(n\)。
样例输入
1
样例输出
2
提示
【数据范围】
对于 \(100\%\) 的数据,\(1\le k \le 15\)。
【题目来源】
NOIP 2002 普及组第一题
解题思路
参考程序1
#include<bits/stdc++.h>
using namespace std;
int k;
double s;
int main(){
cin>>k;
for(int i=1;;i++){
s+=1.0/i;
if(s>k){
cout<<i;
return 0;
}
}
return 0;
}
参考程序2
#include<bits/stdc++.h>
using namespace std;
int k,n;
double ans;
int main(){
cin>>k;
n=1;
while(ans<=k){
ans+=1.0/n;
n++;
}
cout<<n-1;
return 0;
}
参考程序3
#include<bits/stdc++.h>
using namespace std;
int k,n;
double ans;
int main(){
cin>>k;
n=0;
while(ans<=k){
n++;
ans+=1.0/n;
}
cout<<n;
return 0;
}
参考程序4
#include<bits/stdc++.h>
using namespace std;
int k,n;
double ans;
int main(){
cin>>k;
n=1;
do{
ans+=1.0/n;
n++;
}while(ans<=k);
cout<<n-1;
return 0;
}
参考程序5
#include<bits/stdc++.h>
using namespace std;
int k,n;
double ans;
int main(){
cin>>k;
n=0;
do{
n++;
ans+=1.0/n;
}while(ans<=k);
cout<<n;
return 0;
}
作者:newcode 更多资源请关注纽扣编程微信公众号
从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习