蓝桥等考-中级-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;
}
posted @ 2023-03-17 15:56  new-code  阅读(38)  评论(0编辑  收藏  举报