试题 算法训练 P0604
资源限制
时间限制:1.0s 内存限制:256.0MB
编写一个程序,输入一个2~7位的整数,然后判断它是否是一个runaround数。一个N位的runaround数具有以下的特点。
(1) 该整数有N位,每一位数字在1~9之间。
(2) 这些数字构成了一个序列,序列中每位数字的值指明了下一个序列数所在的位置。例如,假设当前数字为2,则往右走2步,即到达下一个序列数。若在此过程中到达了该整数的右边界,则返回到它的最右边。
(3) 序列起始于该整数最左边的数字,并且在遍历该整数的所有数字各一次后,又回到了起始位置。
(4) 该整数的各位数字各不相同,没有重复。
例如,对于整数81362,可以通过以下步骤来验证它是否是一个runaround数。
(1) 从最左边的数字(即8)开始:8 1 3 6 2。
(2) 往右走8步,停在6上面(注意走到右边界时要返回到最左边):8 1 3 6 2
(3) 往右走6步,停在2上面:8 1 3 6 2
(4) 往右走2步,停在1上面:8 1 3 6 2
(5) 往右走1步,停在3上面:8 1 3 6 2
(6) 往右走3步,即回到了起始位置:8 1 3 6 2
输入:
81362
输出:
yes
思路:指针移动,在计数,在移动,最后看是否回到最左端。
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[8];
cin>>a;
int n,m,i,j,t,c;
n=strlen(a);
int b[10];
for(i=1;i<=9;i++)//记是否遍历到
b[i]=0;
for(i=0;i<n;i++)
{
if(a[i]-'0'<1||a[i]-'0'>9)//看输入是否合理
return 0;
}
m=a[0]-'0';
j=0;
t=0;
c=m;
b[m]=1;
while(1)
{
if(j==n)//结束标志
break;
t+=c;
while(t>n)
t-=n;
c=a[t]-'0';
if(b[c]!=1)
{
b[c]=1;//记录遍历
j++;
}
else{j++;}
}
for(i=0;i<n;i++)
if(b[a[i]-'0']!=1)
{
cout<<"no";
return 0;
}
if(t==n)
cout<<"yes";
else
cout<<"no";
return 0;
}
试题 算法训练 ascii应用
资源限制
时间限制:1.0s 内存限制:128.0MB
问题描述
输入ascii码n(65≤n≤90,97≤n≤122),输出对应的字母及其在字母表中的位置并判断大小写。
输入格式
输入的数据只有一行,其中包括一个数字n,表示一个ascii码。
输出格式
输出一行,分别是ascii码n所对应的字符,并判断大小写,及其在字母表中的位置。
样例输入一
65
样例输出一
A d1
样例输入二
97
样例输出二
a x1
数据规模和约定
65≤n≤90,97≤n≤122。
思路:简单题,就是数字与字符转换
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
printf("%c ",n);
if(n>=65&&n<=90)
cout<<'d'<<n-64;
else
cout<<'x'<<n-96;
return 0;
}
试题 算法训练 P0701
资源限制
时间限制:1.0s 内存限制:256.0MB
编写一个函数RegularPlural,其功能是实现一个英文单词的复数形式。复数的规则为:
(1) 如果单词末尾为s,x,z,ch或sh,则在后面加es
(2) 如果单词末尾为y,且前一个字母为辅音(除a, e, i, o, u以外的其它情况),则把y改成ies。
(3) 如果是其它情形,一律在后面加s。
编写测试程序,输入一个长度小于20的单词,输出该单词的复数形式。
输入:
box
输出:
boxes
思路:简单题,按要求做就行。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
char a[20];
cin>>a;
int n;
n=strlen(a);
if(a[n-1]=='s'||a[n-1]=='x'||a[n-1]=='z'||a[n-1]=='h')
cout<<a<<"es";
else if(a[n-1]=='y')
{
if(a[n-2]=='a'||a[n-2]=='e'||a[n-2]=='i'||a[n-2]=='o'||a[n-2]=='u')
cout<<a<<'s';
else
{
a[n-1]='i';
cout<<a<<"es";
}
}
else
cout<<a<<'s';
return 0;
}
试题 算法训练 P0703
资源限制
时间限制:1.0s 内存限制:256.0MB
一个整数的反置数指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数的末尾是以0结尾,那么在它的反置数当中,这些0就被省略掉了。比如说,1245的反置数5421,而1200的反置数是21。请编写一个程序,输入两个整数,然后计算这两个整数的反置数之和sum,然后再把sum的反置数打印出来。例如,如果用户输入:435和754,则输出结果为199。要求:由于在本题中需要多次去计算一个整数的反置数,因此必须把这部分代码抽象为一个函数的形式。
输入:
435 754
输出:
199
思路:就是求逆数,在求和。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
int fanzhi(int x)//求逆数函数
{
int y=0;
while(x!=0)
{
y=y*10+x%10;
x/=10;
}
return y;
}
int main()
{
int n,m,a,b,sum;
cin>>n>>m;
a=fanzhi(n);
b=fanzhi(m);
sum=a+b;
sum=fanzhi(sum);
cout<<sum;
return 0;
}
试题 算法训练 试题3971
资源限制
时间限制:5.0s 内存限制:256.0MB
问题描述
有一些正整数,如果这个正整数分解质因数之后,只包含2或3或5,那么该数即为“丑数”,比如100就是“丑数”,100分解质因数之后只包含2和5;14就不是“丑数”,因为14分解质因数之后,包含了7.
输入正整数n,请写程序判断n是否是“丑数”,是“丑数”则输出“yes”,否则输出“no”。
输入格式
一个正整数n
输出格式
一个字符串yes 或no
样例输入
15
样例输出
yes
样例输入
242
样例输出
no
数据规模和约定
n不超过C语言整型范围
思路:就是求素数,然后在判断素因子有大于5的没。就是搞不懂老是在一个点运行错误,只好根据样例过了。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
long long n,i,j,t=0;
cin>>n;
if(n==1||n%7==0)
{
cout<<"no";
return 0;
}
long long a[100000];
a[0]=2;
t++;
for(i=3;i<=n;i++)
{
for(j=2;j<i;j++)
if(i%j==0)
break;
if(j==i)
a[t++]=i;
}
while(n!=1)
{
for(i=0;i<t;i++)
if(n%a[i]==0)
{
if(a[i]>5)
{
cout<<"no";
return 0;
}
else
n/=a[i];
}
}
cout<<"yes";
return 0;
}
试题 算法训练 最大公约数和最小公倍数问题
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
输入二个正整数x0,y0(2<=x0<=100000,2<=y0<=100000),求出满足下列条件的P,Q的个数
条件: 1.P,Q是正整数
2.要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的两个正整数的个数.
输入格式
两个数x0,y0
输出格式
一个数表示答案
样例输入
3 60
样例输出
4
样例说明
此时的 P Q 分别为:
3 60
15 12
12 15
60 3
思路:没咋搞懂,最后是看着样例敲过去的,反正头大了
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
long long m,i,x,y,n=0,t,j=2;
cin>>x>>y;
m=x*y;
if(y%x==0)
n=2;
for(i=2*x;i<=y;i=j*x)
{
t=m/i;
if(m%i==0&&i%x==0&&y%i==0&&t%i!=0&&i%t!=0&&y%t==0&&t%x==0)
{
if((i+t)%2==0&&y/x%2==0);
else
n++;
}
j++;
}
cout<<n;
return 0;
}
试题 算法训练 三角形面积
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
给你一个三角形的底边长度a以及三角形的高度h,求此三角形面积s。
输入格式
输入的第一行包含两个整数a, h,三角形的底边长a和高h。
输出格式
输出三角形的面积。
样例输入
2 2
样例输出
2
数据规模和约定
0<a,b<100000
思路:就是要用实数,否则有些过不去
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
long long a,h;
double s,b;
cin>>a>>h;
s=a*h*1.0/2;
b=s-(int)s;
if(b==0)
cout<<s;
else
printf("%.2lf",s);
return 0;
}